【发布时间】:2014-04-15 21:59:47
【问题描述】:
【问题讨论】:
-
因为如果对象被释放,
assign仍然会有指向先前释放对象的指针(一个“悬空指针”),而如果你使用weak,指针将被设置为nil当对象被释放时。
标签: objective-c delegates automatic-ref-counting
【问题讨论】:
assign 仍然会有指向先前释放对象的指针(一个“悬空指针”),而如果你使用weak,指针将被设置为nil当对象被释放时。
标签: objective-c delegates automatic-ref-counting
使用 ARC,当 ivar 对象被释放时,weak ivar 将自动设置为 nil。这意味着如果您的委托被销毁并且您尝试向委托发送消息,您只会发送 nil 消息,这没有任何效果。如果委托 ivar 只是 assign,那么您将向一些不再包含有效对象的内存块发送消息。
【讨论】:
assign 和weak 之间的唯一区别是weak 做了额外的工作来避免一些常见的崩溃错误。然而,缺点是assign 的性能比weak 好得多。
具体来说,当一个对象被释放时,任何指向它的weak属性都会被设置为nil。任何指向它的assign 属性都将指向不再使用的对象。
而其他一些对象很可能与旧对象放置在内存中的同一位置,所以突然之间,您可能在内存中的同一位置而不是MyDelegate 的实例,或者可能有一个UIImage 对象一个浮点值,或者任何东西。
因此,您应该始终使用weak 来表示所有内容。但如果遇到性能问题,请检查是否是 weak 引起的,并在了解如何避免这些崩溃错误后考虑切换到 assign。
对于代表,您几乎应该始终使用weak。通常,如果您要处理数百万个对象,您只会选择assign。通常情况下,委托不会发生这种情况。
【讨论】: