使用 ARC 的 Objective-C 代表

Posted

技术标签:

【中文标题】使用 ARC 的 Objective-C 代表【英文标题】:Objective-C Delegates with ARC 【发布时间】:2011-11-07 20:04:47 【问题描述】:

我正在编写一个具有对委托对象的回调的类,但遇到 ARC 问题。

例如我有符合 ProtocolA 的 ObjectA(委托)和 ObjectB,它是回调委托的对象。我将 ObjectA 作为 @property 存储在 ObjectB 中。

在这种情况下,哪些变量应该是强引用,哪些应该是弱引用?我需要避免将“self”从 ObjectA 传递到 ObjectB 以设置委托导致从强指针转换为弱指针的情况。

【问题讨论】:

【参考方案1】:

为避免循环引用,请将 ObjectB 的委托保存为弱引用。因为 ObjectA “拥有” ObjectB,所以不应释放 ObjectA,而 ObjectB 有对它的引用。所以写:

    @property (weak, nonatomic) id <ObjectBDelegate> delegate;

【讨论】:

谢谢。这很好用——我犯了一个错误,因为“@property (weak, nonatomic) id *delegate;”,并得到了一些非常无用的错误消息,让我认为这是一个强/弱参考问题! 伙计,* 很好地隐藏在那里。 我也有一个指针......坦率地说,这个问题的有趣解决方案。【参考方案2】:

委托属性通常应该是弱的。将消息传递给委托的对象并不“拥有”委托,实际上它通常是相反的。

【讨论】:

以上是关于使用 ARC 的 Objective-C 代表的主要内容,如果未能解决你的问题,请参考以下文章

Objective-c开发教程--MRC和ARC混编

在 Objective-C 中使用 ARC 时 AutoRelease 是多余的吗?

尽管标记了文件 -fno-objc-arc,但 ARC 禁止在结构或联合中使用 Objective-C 对象

Objective-C内存管理之ARC

Objective-C内存管理之ARC

Objective-c的内存管理MRC与ARC