我见过很多与代表有关的帖子,我想知道引用它们的正确方法。假设我有一个声明为:
的对象@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
。这只是“糟糕的代码吗?”我在这里请专家......处理这个问题的正确方法是什么?
答案 0 :(得分:21)
您通常希望分配代理而不是保留它们,以避免循环保留计数,其中对象A保留对象B而对象B保留对象A.(您可能会看到这被称为保留对象的“弱引用”)委托。)例如,考虑以下常见模式:
-(void)someMethod {
self.utilityObject = [[[Bar alloc] init] autorelease];
self.utilityObject.delegate = self;
[self.utilityObject doSomeWork];
}
如果使用utilityObject
声明delegate
和retain
属性,则self
现在保留self.utilityObject
,self.utilityObject
保留{{1} }}。
有关详情,请参阅Why are Objective-C delegates usually given the property assign instead of retain?。
如果您分配代理而不是保留代理,那么您无需担心在dealloc中释放代理。
答案 1 :(得分:1)
它通常表示设计错误,因为大多数代表保留其对象(创建保留循环的可能性,从而泄漏。)但在某些情况下,对象应保留其委托。这些通常是对象没有可用引用的情况,因此委托不能保留它 - 但这本身有时可能表示设计不良。
答案 2 :(得分:0)
我也听到了很多意见。我不知道正确的方法,但我可以告诉你我通过自己的工作得到了什么。
您希望retain
保留句柄所需的任何内容。在参考计算环境中,所有权都是。这是一个声明,“我以后需要这个,不要让它消失在我身上”。
ALSO表示您有责任解除对此的索赔。如果你没有专门做到这一点,你就会遇到各种各样的问题,尤其是处理那些可能会保留他们所代表的对象的代表。如果您不处理您对代理人的保留,则所有权将是周期性的,并且对象将泄漏。但是别忘了释放你保留的东西,你会没事的。