我看过一些与代表有关的帖子,我想知道参考它们的正确方法.假设我有一个声明如下的对象:
@interface MyViewController : UITableViewController { id delegate; } @property (nonatomic,retain) id delegate; @end
通过MyViewController的生命周期,它将调用其代理的方法以响应与用户的交互.
当它是时候摆脱MyViewController的一个实例时,是否需要在实现的dealloc方法中释放代理ivar,因为它被声明为retain?
或者反过来呢,是否应该授权呢?也许应该是@property(非原子,分配)id委托?根据Apple’s docs:
retain … You typically use this attribute for scalar types such as NSInteger and CGRect,or (in a reference-counted environment) for objects you don’t own such as delegates.
通常我只是去跟文档说的一样,但是我看到很多代码被保留在代理上.这只是“糟糕的代码”吗?我在这里推荐专家吗?处理这个问题的正确方法是什么?
解决方法
您通常希望分配代理而不是保留它们,以避免对象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保留self.
有关更多信息,请参阅Why are Objective-C delegates usually given the property assign instead of retain?.
如果你分配代理而不是保留它,那么你不需要担心在dealloc中释放它.