代表 – 保留或分配 – 释放?

我看过一些与代表有关的post,我想知道引用它们的正确方法。 假设我有一个对象声明如下:

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

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

当是摆脱MyViewController实例的时候, delegate ivar是否需要在实现的dealloc方法中release ,因为它是用retain声明的?

或者相反,应该delegate甚至保留? 也许它应该是@property (nonatomic, assign) id delegate ? 根据苹果的文件 :

保留…您通常使用此属性的标量types,如NSInteger和CGRect,或(在引用计数的环境中)您不拥有的对象,如委托。

通常情况下,我只是去与文档说,但我已经看到了很多代码调用retain在委托。 这只是“错误的代码?” 我请这里的专家……处理这个问题的正确方法是什么?

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

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

如果utilityObjectdelegate属性都使用retain声明,那么self现在保留self.utilityObjectself.utilityObject保留self

请参阅Objective-C委托人为什么通常给予属性赋值而不是保留? 更多关于这个。

如果你分配委托而不是保留它,那么你不需要担心在dealloc中释放它。

这通常表示devise不好,因为大多数代表保留了他们的对象(创造了留住循环的潜力,从而泄漏)。但是在某些情况下,对象应该保留它的代表。 通常情况下,对象没有可用的参考,所以委托人不可能是保留对象的人 – 但是这本身有时可能表明devise不好。

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

你想retain任何你需要保留你的句柄。 这是所有权,在一个参考计数的环境。 这是一个声明,“我以后需要这个,不要让它离我而去”。

这也意味着你有责任释放你的要求。 如果你不具体这样做,你很容易出现各种各样的问题,但特别是处理可能会保留它们代表的对象的代表。 如果你不处理你对代表的保留,所有权将是周期性的,并且对象将会泄漏。 但不要忘记释放你保留的东西,你会没事的。