保留环也就是我们常说的循环引用。保留环通常会造成内存泄漏。
避免保留环的最佳方式就是弱引用。这种引用经常用来表示“非拥有关系”(nonowning relationship)。将属性声明为unsafe_unretained或weak。
用unsafe_unretained修饰的属性特质,其语义同assign特质等价。然而,assign通常只用于“基本类型”(int float 结构体等), unsafe_unretained则多用于对象类型。这个词本身就表明其所修饰的属性可能无法安全使用。
用weak修饰的属性特质,与ARC相伴的运行期特性,它与unsafe_unretained的作用完全相同。然而,只要系统把属性回收,属性值就会自动设为nil。
这一与ARC相伴的运行期特性,可以令开发者安全使用弱引用。
- unsafe_unretained与weak属性,在其所指的对象回收以后表现出来的行为不同。当指向实例的引用移除后,unsafe_unretained属性仍然指向那个已经回收的实例,而weak属性则指向nil。
要点
将某些引用设为weak,可避免出现保留环。父引用子 强引用(strong) 子引用父 弱引用(weak)。
weak引用可以自动清空,也可以不自动清空。自动清空(autonilling)是随着ARC而引入的新特性,由运行期系统来实现。在具备自动清空功能的弱引用上,可以随意读取其数据,因为这种引用不会指向已经回收的对象。