我在 Xcode6 上写了 Wikipedia 上的 Objective-C 委托模式示例。每次设置委托时都会出现警告“将保留对象分配给弱属性;分配后对象将被释放”。运行示例后,A 类的方法 f 和 g 不执行。换行
@property (weak, nonatomic) id i; // 代表团
到
@property(强,非原子)id i;// 代表团
解决问题。这是为什么?
我在 Xcode6 上写了 Wikipedia 上的 Objective-C 委托模式示例。每次设置委托时都会出现警告“将保留对象分配给弱属性;分配后对象将被释放”。运行示例后,A 类的方法 f 和 g 不执行。换行
@property (weak, nonatomic) id i; // 代表团
到
@property(强,非原子)id i;// 代表团
解决问题。这是为什么?
通常,在委托模式中,您希望引用是弱的,因为它引用的委托是另一个对象的强属性。由于这些通常不属于具有该delegate
属性的对象(i
在您的示例中),因此您不想保留对它们的强引用。事实上,你有一个对象是很常见的,比如一个窗口控制器(或 iOS 中的导航控制器),它拥有一个你想将其委托设置回窗口控制器的对象(比如某种控件) (或导航控制器)。
在这种情况下,您需要delegate
弱引用以防止保留循环(否则窗口控制器拥有对控件的引用,该控件拥有对窗口控制器的引用作为委托)。
因此,在您上面的示例中,您最好通过使用一个更真实的示例来探索这个概念,其中委托本身由另一个对象保留,这更接近地反映了委托在野外的使用方式。