繁体   English   中英

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

[英]Delegates - retain or assign - release?

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

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

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

当它摆脱的一个实例的时间MyViewController ,莫非delegate伊娃需要被release在执行的“编dealloc方法,因为它是与声明retain

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

retain ...您通常将此属性用于标量类型(如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中释放它。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM