2013-12-17 54 views
1

我有一個AMContact對象,其中其強大的特性之一是AMEmailAddress對象的數組。一個聯繫人可以有很多電子郵件地址我可以在指向聯繫人對象的電子郵件地址對象上創建一個強大的屬性嗎?兒童失去其弱引用父

我覺得,如果它很強的借鑑意義有可能是一個保留週期。如果我使它變弱,當我執行查詢以獲取所有電子郵件地址對象時,在某一時刻,每個電子郵件地址對象的聯繫對象正在變爲零。

- (NSArray*)allEmailAddresses 
{ 
    NSArray *allContacts = [self allContacts]; 
    NSMutableArray *emailAddresses = [NSMutableArray array]; 

    for (AMContact *contact in allContacts) { 
     if (contact.emailAddresses) { 
      for (AMEmailAddress *address in contact.emailAddresses) { 
       [emailAddresses addObject:address]; 
      } 
     } 
    } 
    if (emailAddresses.count > 0) { 
     return emailAddresses; 
    } 
    return nil; 
} 


@interface AMContact : NSObject 

@property (nonatomic, strong) NSString *firstName; 
@property (nonatomic, strong) NSString *lastName; 


// arrays of AMEmailAddress, AMPhoneNumber objects 
@property (nonatomic, strong) NSArray *emailAddresses; 
@property (nonatomic, strong) NSArray *phoneNumbers; 

@end 

@interface AMEmailAddress : NSObject 

@property (nonatomic, strong) NSString *label; 
@property (nonatomic, strong) NSString *email; 
@property (nonatomic, strong) AMContact *contact; // IS THIS OK OR A RETAIN CYCLE? 

@end 
+0

你說過「某一時刻每個人的聯繫對象正在變爲零」 - 這種情況到底發生在什麼時候?在您發佈的代碼或使用其他方法的部分代碼中? –

回答

2

短而簡單回答你的問題:我能創建一個指向接觸對象我的電子郵件地址對象強大的性能?你

可以嗎?是。你應該?絕對不。你的模型設計已經暗示了這種關係應該是什麼 - AMContact對象擁有電子郵件地址,而不是相反。讓電子郵件地址有一個強烈的參考父對象是不是一個好辦法去做這件事。從小孩迴歸主人應該很弱。事實上,你的AMContact實例將會是零,這是確定範圍和設計的一個問題,你不應該使用強大的參考來解決這個問題。

至於爲什麼你AMContact實例會爲零 - 因爲如果AMContact對象變爲零這是一個有點奇怪,其子對象也應如此。在你發佈的代碼中,或者在其他方法的某個其他位置,它是否爲零?看到你試圖引用它的代碼,它是零,這將是很好的。

UPDATE:

如果你想有電子郵件地址的聯繫人列表,你應該改變方法返回。然而,我猜你的意思是你想要他們的電子郵件地址列表與他們相關的聯繫人。在這種情況下,您必須翻轉關係,並將電子郵件視爲父母,並將聯繫人視爲孩子。請注意,如果聯繫人有多個電子郵件地址,那麼您將有多個對同一聯繫人的引用。假設你有AMContact型的你AMEmailAddress對象contact財產,我會添加如下一行:

for (AMEmailAddress *address in contact.emailAddresses) { 

      //Assign the contact as a property of the email address 
      //Make sure the contact property is strong 
      address.contact = contact; 

      [emailAddresses addObject:address]; 
     } 

//Nil out the emailAddresses array 
contact.emailAddresses = nil; 

UPDATE:

確定,所以現在你應該有一個翻轉的對象 - emailAddress爲家長和contact作爲孩子,沒有從contactemailAddress的強烈參考。這意味着您將不能再次使用contact對象來重新獲取電子郵件地址。如果你需要保持原來的contact對象,那麼你是對的,你必須將它作爲一個屬性存儲在視圖控制器或另一個類中 - 對於像這樣的方法,我必須處理人物對象(允許用戶邀請朋友等)我使用「人員經理」單身人士,並保留所有原始對象。

+0

感謝您的回答。我認爲allEmailAddresses方法中發生的事情是,我得到所有聯繫人的數組,找到包含電子郵件的聯繫人,然後保存並返回電子郵件對象。沒有人保留這個原始的聯繫數組,這一定是爲什麼它會變爲零。我如何防止這種情況? –

+0

更新的答案 - 讓我知道如果這就是您要找的 –

+0

謝謝。它會在這種情況下工作,但其他時間我需要的聯繫人是我售貨的對象。所以在這種情況下,我的電子郵件地址數組是一個弱項屬性似乎不起作用。我試過的一個解決方案是將視頻控制器的聯繫人數據發佈出去,在一個屬性中保留對該聯繫人的引用,然後使用與上面相同的例程獲取我的電子郵件對象。這是有效的,因爲有人保持對聯繫人對象的強烈引用。缺點是他們佔用了一些我不想使用的內存。這是一個好的設計? –

0
你的情況

嗯,我認爲這是非常清楚的聯繫是他的電子郵件地址的所有者(父),所以你將只是以這種方式設計這種關係,即用弱引用回到避免任何週期聯繫。如果您使用強力參考,那麼您將有一個保留週期,因爲NSArray將其保留在emailAdresses中。現在

,我會檢查你的程序的結構,看看如何以及爲什麼你失去了在弱引用的聯繫人,必須有所釋放他們,也許,您的聯繫葉範圍過早?

關於保留週期,您可以在此great article中獲得更多信息和建議,也有一些解決方法,但我會鼓勵您堅持更有意義的設計。