如果委托使用assign而不是weak,为什么app会崩溃?

时间:2014-04-15 21:59:47

标签: objective-c delegates automatic-ref-counting

我看到report如果委托使用assign而不是weak,则应用程序崩溃。为什么呢?

示例:RestKit

2 个答案:

答案 0 :(得分:3)

使用ARC时,当释放ivar对象时,weak ivar将自动设置为nil。这意味着如果您的委托被销毁并且您尝试向委托人发送消息,那么您将只发送消息nil,这无效。如果委托ivar只是assign,那么你会发送一些不再包含有效对象的内存。

答案 1 :(得分:-1)

assignweak之间的唯一区别是,weak会做额外的工作来避免一些常见的崩溃错误。然而,缺点是assign的性能要比weak好得多。

具体来说,当一个对象被释放时,指向它的任何weak属性都将被设置为nil。指向它的任何assign属性都将指向不再使用的对象。

并且其他一些对象可能与旧对象放在内存中的相同位置,因此突然而不是MyDelegate的实例,您可能在同一位置有一个UIImage对象记忆,或者可能是浮动值,或者任何东西。

因此,您应该始终使用weak。但是如果遇到性能问题,请检查weak是否是原因,并在学习如何避免这些崩溃错误后考虑切换到assign

对于代理人,你几乎总是使用weak。通常情况下,如果您正在处理数百万个对象,则只需选择assign。通常,代表不会发生这种情况。