【问题标题】:Why would app crash if delegate uses assign instead of weak?如果委托使用分配而不是弱,为什么应用程序会崩溃?
【发布时间】:2014-04-15 21:59:47
【问题描述】:

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

示例:RestKit

【问题讨论】:

  • 因为如果对象被释放,assign 仍然会有指向先前释放对象的指针(一个“悬空指针”),而如果你使用weak,指针将被设置为nil当对象被释放时。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    而其他一些对象很可能与旧对象放置在内存中的同一位置,所以突然之间,您可能在内存中的同一位置而不是MyDelegate 的实例,或者可能有一个UIImage 对象一个浮点值,或者任何东西。

    因此,您应该始终使用weak 来表示所有内容。但如果遇到性能问题,请检查是否是 weak 引起的,并在了解如何避免这些崩溃错误后考虑切换到 assign

    对于代表,您几乎应该始终使用weak。通常,如果您要处理数百万个对象,您只会选择assign。通常情况下,委托不会发生这种情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 2016-07-20
      • 2017-06-06
      • 2015-02-12
      相关资源
      最近更新 更多