2013-12-17 52 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中获得更多信息和建议,也有一些解决方法,但我会鼓励您坚持更有意义的设计。