Objective-C代码经常出现一些情况,就是几个对象都以某种方式互相引用,从而形成"环"(cycle)。由于Objective-C内存管理模型使用引用计数架构,所以这种情况通常会泄露内存,因为最后没有别的东西会引用环中的对象。这样的话,环里的对象就无法为外界所访问了,但对象之间尚有引用,这些引用使得它们都能继续存活下去,而不会为系统所回收。最简单的保留环由两个对象构成,它们互相引用对方。
避免保留环的最佳方式就是弱引用,这种引用经常用来表示"非拥有关系",将属性声明为unsafe_unretained。通过unsafe_unretained声明属性,实例不再拥有它,但是属性值可能不安全,而且不归此实例所拥有。如果系统已经把属性所指的那个对象回收了,那么在其上调用方法可能会使应用程序崩溃。由于本对象并不保留属性对象,因此其有可能为系统所回收。
用unsafe_unretained修饰的属性特质,其语义同assign特质等价。然而,assign通常只用于int、float、结构体等,unsafe_unretained则多用于对象类型。这个词本身就表明其所修饰的属性可能无法安全使用。
使用weak属性,它与unsafe_unretained的作用完全相同,然而,只要系统把属性回收,属性值就会自动设为nil。
当指向EOCClassA实例的引用移除后,unsafe_unretained属性仍然指向那个已经回收的实例,而weak属性则指向nil。