将保留对象分配给 weak 属性;对象将在分配后释放

Assigning retaining object to weak property; object will be released after assignment

我在 Xcode6 上写了 Objective-C 委托模式的例子 Wikipedia。每次设置委托时都会出现警告 "Assigning retaining object to weak property; object will be released after assignment"。在 运行 示例之后,A class 的方法 f 和 g 不执行。 更改行

@property (weak, nonatomic) id i; // delegation

@property (strong, nonatomic) id i; // delegation

解决问题。这是为什么?

通常,在委托模式中,您希望引用是弱引用,因为它引用的委托是另一个对象的 strong 属性。由于这些通常 not 属于具有 delegate 属性 的对象(在您的示例中为 i),您不想保留对他们的强烈参考。事实上,您拥有一个对象(例如 window 控制器(或 iOS 中的导航控制器))是很常见的,该对象拥有一个对象(例如某种类型的控件),您可以将其委托给您想要设置回 window 控制器(或导航控制器)。

在这种情况下,您需要 delegate 引用弱以防止保留循环(否则 window 控制器拥有对控件的引用,该控件拥有对 window 控制器作为代表)。

因此,在您上面的示例中,您最好使用一个更真实的示例来探索这个概念,其中委托本身由另一个对象保留,这更接近地反映了委托在狂野。