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