以 弱引用 避免保留环 (死循环)
对象图里面经常出现一种情况,就是几个对象都以某种方式互相引用,从而形成'环', 由于 OC 内存管理模型使用引用计数架构, 所以这种情况通常会泄漏内存, 因为左后没有别的东西会引用环中的对象,这样的话, 环里的对象就无法为外界所访问了, 但是对象之间尚有引用, 这些引用是的他们都能继续存下去,而不会为系统所回收.
最简单的保留环 由两个对象构成,他们互相引用对方, 这种保留环产生的原因不难理解, 而且很容易就能通过代码侦察出来.
避免保留环的最佳方式 就是弱引用, 这种引用经常用表示 '非拥有关系',将属性声明为 unsafe_unretained 即可,属性特质 unsafe_unretained 一词表明,属性值可能不安全,而且不归此实例所拥有,如果系统已经把属性所指的那个对象回收了, 那么在其上调用方法可能会导致应用程序崩溃. 由于本对象并不保留属性对象, 因此其有可能为系统所回收.
用 unsafe_unretained 修饰的属性特质,其语义同 assign 特质等价, 然而,assign 通常只用于 '整体类型' (int,float,结构体等), unsafe_unretained 则多用于对象类型, 这个词本身就表示其所修饰的属性可能是无法安全使用的.
OC 还有一项与 ARC 相伴的运行期特性, 可以领开发者安全使用的弱引用, 这就是 weak 属性特质, 他与 unsafe_unretained 的作用完全是等价的, 然而,只要系统吧属性回收,属性值就会自动设为 nil,
当指向属性实例的引用移除后, unsafe_unretained 属性仍然指向那个已经移除的实例, weak 属性则指向 nil.
一般来说,使用weak 比使用 unsafe_unreatained 更加安全.
如果不拥有某个对象,那就不要保留它.
总结: 将某些引用设为 weak. 可以避免出现 '保留环' (死循环);
weak 引用可以自动清空, 也可以不自动清空,自动清空是随着 ARC 而引入的新特性,由运行期系统来实现, 在具备自动清空功能的弱引用上, 可以随意读取其数据, 因为这种引用不会指向已经回收过的数据
网友评论