ARC是iOS5后引入的,这是编译器特性而不是OC的语言特性。
ARC的实质就是由编译器自动实现retain,release,dealloc。其实质还是引用计数,只是我们不需要显示的去调用引用计数相关函数而已。
在ARC后有四种所有权修饰符:
__strong,__weak,_unsafe_unretained,_autoreleasing。
__strong表示强引用,可以持有对象。
__weak表示弱引用,不能持有对象。
所谓的持有对象,就是当强引用被赋值后,对象的引用计数会加1。而弱引用则不会,它只是简单的把指针地址赋值。所以这样的后果就是,如果强引用指向别的值或者nil的时候如果原对象的引用计数为0时,这个对象就被销毁了。而弱引用所指向的原对象则不会。
弱引用可以避免循环引用。
弱引用还有一个好处,如果弱引用正指向的对象被销毁了,编译器会为其置为nil。所以可以通过检测弱引用是否为nil来判断其是否有效。
ARC下属性声明属性与所有权修饰符的对应关系:
属性声明的属性 | 所有权修饰符
assign | __unsafe_unretained
copy | __strong(但是赋值的是被复制的对象)
retain | __strong
strong | __strong
unsafe_unretained | __unsafe_unretained
weak | __weak