在 ARC 模式下 代理是使用 assign 还是 weak 修饰

ARC 模式下一般情况下 应该使用 weak 修饰,少数情况下使用 assign 修饰。

为什么不使用 strong

使用 strong 修饰代理,会产生强引用,导致循环引用不能释放的问题。

weak 和 assign 的区别

这个问题可以通过斯坦福大学这个公共课里的一段话来解释

“The main difference between weak and assign is that the with weak, once the object being pointed to is no longer valid, the pointer is nilled out. Assigning the pointer the value nil avoids many crashes as messages sent to nil are essentially no-ops”

Excerpt From: Daniel H Steinberg.

“Developing iOS 7 Apps for iPad and iPhone.” Dim Sum Thinking, Inc, 2014. iBooks. iTunes - Books

也就是说 weak 比 assign 多了一个功能,当引用计数为0的时候 weak 会自动将 delegate = nil,这样再向 weak 修饰的对象发送消息就不会出现野指针 crash。

weak 和 assign 分别在什么情况下使用

ARC 模式下,绝大部分情况下都可以使用 weak 来修饰代理;当需要在代理的 dealloc方法中访问代理对象做一些特殊操作的时候就需要使用 assign 来修饰代理,然后在代理的 dealloc 方法的最后 手动设置代理为空(self.delegate = nil)。