Objective c 将保留对象分配给弱势财产;对象将在分配后释放

Objective c 将保留对象分配给弱势财产;对象将在分配后释放,objective-c,xcode,memory-management,delegates,weak,Objective C,Xcode,Memory Management,Delegates,Weak,我在Xcode6上编写了Objective-C委托模式的示例。每次设置代理时,都会出现一条警告“将保留对象指定给弱属性;对象将在指定后释放”。运行示例后,类的方法f和g不会执行。 换线 @属性(弱,非原子)id i;//授权 到 @属性(强,非原子)id i;//授权 解决问题。为什么会这样?通常,在委托模式中,您希望引用是弱的,因为它引用的委托是另一个对象的强属性。由于这些属性通常不属于具有delegate属性的对象(在您的示例中为i),因此不希望保留对它们的强引用。事实上,您通常会有一个对象

我在Xcode6上编写了Objective-C委托模式的示例。每次设置代理时,都会出现一条警告“将保留对象指定给弱属性;对象将在指定后释放”。运行示例后,类的方法f和g不会执行。 换线

@属性(弱,非原子)id i;//授权

@属性(强,非原子)id i;//授权


解决问题。为什么会这样?

通常,在委托模式中,您希望引用是弱的,因为它引用的委托是另一个对象的强属性。由于这些属性通常不属于具有
delegate
属性的对象(在您的示例中为
i
),因此不希望保留对它们的强引用。事实上,您通常会有一个对象,例如窗口控制器(或iOS中的导航控制器),它拥有一个对象(例如某种类型的控件),您希望将该对象的委托设置回窗口控制器(或导航控制器)

在这种情况下,您需要将
委托
引用设置为弱引用,以防止retain循环(否则,窗口控制器拥有对控件的引用,该控件拥有对作为委托的窗口控制器的引用)

因此,在上面的示例中,最好使用一个更真实的示例来探索这个概念,其中委托本身由另一个对象保留,这更接近于野外使用委托的方式