ARC 下
__strong:强引用,持有所指向对象的所有权,无修饰符情况下的默认值.如需强制释放,可置 nil
__weak:弱引用,不持有所指向对象的所有权,引用指向的对象内存被回收之后,引用本身会置 nil,避免野指针.避免循环引用,会将对象注册到 autoreleasepool
unsafe_unretained:相当于 assign.直接赋值.引用计数不变
属性的内存管理
assign
直接赋值,一般用来修饰基本数据类型。当然也可以修饰ObjC对象,但是不推荐,因为被assign修饰的对象释放后,指针还是指向释放前的内存,在后续操作中可能会导致内存问题引发崩溃。
retain
retain 和 strong 一样,都用老修饰 ObjC对象,使用 set方法赋值时,实质上是先保留新增,再释放旧值,再设置新值,避免新旧值一样时导致对象呗释放的问题.
copy
一般用来修饰 String,Dict,Array等需要保护其封装性的对象,尤其是在其内容可变的情况下,因此会拷贝(深拷贝)一份内容跟属性使用,避免可能造成的对元内容进行改动.使用 set方法赋值时,实质上是会先拷贝新值,在释放旧值,再设置新值.实际上,遵守 NSCopying的对象都可以使用 Copy,当然如果你确定要共用同一份可变内容,你也可以使用 strong 或者 retain
weak
ARC新引入修饰词,可代替assign,比assign多增加一个特性(置nil)。weak和strong一样用来修饰ObjC对象。使用set方法赋值时,实质上不保留新值,也不释放旧值,只设置新值。
strong
ARC新引入修饰词,可代替retain,ARC一般都写strong。
unsafe_unretained
等价于assign,可以用来修饰数据类型和OC对象,但是不会使计数器加1,且对象销毁时也不会将对象指向nil,容易造成野指针错误。
block的内存管理
如果你使用@property去声明一个block的时候,一般使用copy来进行修饰(当然也可以不写,编译器自动进行copy操作),尽量不要使用retain。
__weak typeof(self) weakSelf = self;