【问题标题】:how to release "delegate" memories in objective-c?如何在objective-c中释放“委托”记忆?
【发布时间】: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


    【解决方案1】:

    不保留代表是正常的惯例。这主要是因为通常的模式是对象的所有者通常也是它的委托人,如果委托人被保留,您将获得一个保留周期。

    如果您使用的是属性,请像这样声明它:

    @property (assign) DelegateType delegate; // replace "DelegateType" with whatever type you need
    

    并删除-dealloc 中释放委托的行。

    如果访问器已合成,那么您现在就完成了。如果没有,请让访问者分配访问者,例如

    -(DelegateType) delegate
    {
        return delegate;
    }
    
    -(void) setDelegate: (DelegateType) newValue
    {
        delegate = newValue;
    }
    

    【讨论】:

    • 你会建议在 dealloc 中将委托为零吗?
    • @Chandra Patni:在释放委托对象时将委托设置为 nil 很重要(或者在 ARC 和清零弱引用之前)。
    【解决方案2】:

    一般来说,您不应该保留代表。通常的模式只是分配它们。否则,正如您所指出的,您会遇到发布周期等各种问题。

    【讨论】:

      【解决方案3】:

      你如何定义委托的访问器

      @property (nonatomic, retain) Whatever *delegate;
      

      @property (nonatomic, assign) Whatever *delegate;
      

      如果是前者,则保留计数将增加,这不是您希望对委托执行的操作。创建者有责任控制委托。您只是被告知它,不应该保留它。它唯一的 Obj C 能够将消息发送到 nil 而不会失败,这意味着您也不应该在使用前检查引用。

      【讨论】:

      • 所以在向delegate发送消息之前,不需要执行 if(delegate){} 之类的操作?
      • 这不是必要的,但您可能会发现它很有用,即使您采取的唯一措施是记录委托不是为您自己的理智设置的事实
      猜你喜欢
      • 1970-01-01
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      相关资源
      最近更新 更多