代表 - 保留或分配 - 发布?

时间:2011-01-25 16:10:38

标签: ios objective-c cocoa-touch memory-management

我见过很多与代表有关的帖子,我想知道引用它们的正确方法。假设我有一个声明为:

的对象
@interface MyViewController : UITableViewController {
    id delegate;    
}
@property (nonatomic, retain) id delegate;
@end

MyViewController的生命周期中,它将调用其委托的方法以响应与用户的交互。

当需要删除MyViewController的实例时,delegate ivar在实现的release方法中是否需要dealloc',因为它已声明与retain

或者相反,delegate是否应该保留?也许它应该是@property (nonatomic, assign) id delegate?根据{{​​3}}:

  

retain ...您通常将此属性用于标量类型(如NSInteger和CGRect),或者(在引用计数环境中)用于您不拥有的对象(如委托)。

通常情况下我会选择文档说的内容,但我看到很多代码在代理上调用retain。这只是“糟糕的代码吗?”我在这里请专家......处理这个问题的正确方法是什么?

3 个答案:

答案 0 :(得分:21)

您通常希望分配代理而不是保留它们,以避免循环保留计数,其中对象A保留对象B而对象B保留对象A.(您可能会看到这被称为保留对象的“弱引用”)委托。)例如,考虑以下常见模式:

-(void)someMethod {
    self.utilityObject = [[[Bar alloc] init] autorelease];
    self.utilityObject.delegate = self;
    [self.utilityObject doSomeWork];
}

如果使用utilityObject声明delegateretain属性,则self现在保留self.utilityObjectself.utilityObject保留{{1} }}。

有关详情,请参阅Why are Objective-C delegates usually given the property assign instead of retain?

如果您分配代理而不是保留代理,那么您无需担心在dealloc中释放代理。

答案 1 :(得分:1)

它通常表示设计错误,因为大多数代表保留其对象(创建保留循环的可能性,从而泄漏。)但在某些情况下,对象应保留其委托。这些通常是对象没有可用引用的情况,因此委托不能保留它 - 但这本身有时可能表示设计不良。

答案 2 :(得分:0)

我也听到了很多意见。我不知道正确的方法,但我可以告诉你我通过自己的工作得到了什么。

您希望retain保留句柄所需的任何内容。在参考计算环境中,所有权都是。这是一个声明,“我以后需要这个,不要让它消失在我身上”。

ALSO表示您有责任解除对此的索赔。如果你没有专门做到这一点,你就会遇到各种各样的问题,尤其是处理那些可能会保留他们所代表的对象的代表。如果您不处理您对代理人的保留,则所有权将是周期性的,并且对象将泄漏。但是别忘了释放你保留的东西,你会没事的。

相关问题