【发布时间】:2010-11-15 09:46:27
【问题描述】:
对于我的项目,我正在创建委托类。当我分配 obj.delegate = self 时,[self retainCount] 会增加一。那么retain count为2的assigned object应该如何释放delegate object和assigned object的retaincount为1呢?
问候 斯里尼
【问题讨论】:
标签: objective-c delegates
对于我的项目,我正在创建委托类。当我分配 obj.delegate = self 时,[self retainCount] 会增加一。那么retain count为2的assigned object应该如何释放delegate object和assigned object的retaincount为1呢?
问候 斯里尼
【问题讨论】:
标签: objective-c delegates
不保留代表是正常的惯例。这主要是因为通常的模式是对象的所有者通常也是它的委托人,如果委托人被保留,您将获得一个保留周期。
如果您使用的是属性,请像这样声明它:
@property (assign) DelegateType delegate; // replace "DelegateType" with whatever type you need
并删除-dealloc 中释放委托的行。
如果访问器已合成,那么您现在就完成了。如果没有,请让访问者分配访问者,例如
-(DelegateType) delegate
{
return delegate;
}
-(void) setDelegate: (DelegateType) newValue
{
delegate = newValue;
}
【讨论】:
一般来说,您不应该保留代表。通常的模式只是分配它们。否则,正如您所指出的,您会遇到发布周期等各种问题。
【讨论】:
你如何定义委托的访问器
@property (nonatomic, retain) Whatever *delegate;
或
@property (nonatomic, assign) Whatever *delegate;
如果是前者,则保留计数将增加,这不是您希望对委托执行的操作。创建者有责任控制委托。您只是被告知它,不应该保留它。它唯一的 Obj C 能够将消息发送到 nil 而不会失败,这意味着您也不应该在使用前检查引用。
【讨论】:
delegate发送消息之前,不需要执行 if(delegate){} 之类的操作?