答案 0 :(得分:3)
使用ARC时,当释放ivar对象时,weak
ivar将自动设置为nil
。这意味着如果您的委托被销毁并且您尝试向委托人发送消息,那么您将只发送消息nil,这无效。如果委托ivar只是assign
,那么你会发送一些不再包含有效对象的内存。
答案 1 :(得分:-1)
assign
和weak
之间的唯一区别是,weak会做额外的工作来避免一些常见的崩溃错误。然而,缺点是assign
的性能要比weak
好得多。
具体来说,当一个对象被释放时,指向它的任何weak
属性都将被设置为nil
。指向它的任何assign
属性都将指向不再使用的对象。
并且其他一些对象可能与旧对象放在内存中的相同位置,因此突然而不是MyDelegate
的实例,您可能在同一位置有一个UIImage
对象记忆,或者可能是浮动值,或者任何东西。
因此,您应该始终使用weak
。但是如果遇到性能问题,请检查weak
是否是原因,并在学习如何避免这些崩溃错误后考虑切换到assign
。
对于代理人,你几乎总是使用weak
。通常情况下,如果您正在处理数百万个对象,则只需选择assign
。通常,代表不会发生这种情况。