ARC(Automatic Reference Counting 自用引用计数)是苹果在 iOS5 中引入的内存管理机制. Objective-C 和 Swift 使用 ARC 追踪和管理应用的内存使用. ARC是编译器通过对代码的静态分析,确定对象的生命周期,并在合适的位置自动加上retain和release的机制。把内存管理交给编译器以后,我们不需要再调用任何的retain和release了。ARC减少了MRC带来的思考负担,减少了内存问题出现的可能性,也大幅减少了代码量,, 能够大幅度提升程序的 流畅性 和 可预测性 。
ARC的修饰符提供成员变量访问方法、权限、环境、内存管理类型的声明。
属性的参数分为三类,基本数据类型默认为(atomic,readwrite,assign),对象类型默认为(atomic,readwrite,strong),其中第三个参数就是该属性的内存管理方式修饰,修饰词可以是以下之一:
- strong:强引用(引用计数+1),持有所指向对象的所有权,无修饰符情况下的默认值。如需强制释放,可置nil。
- weak:弱引用,不持有所指向对象的所有权,引用指向的对象内存被回收之后,引用本身会置nil,避免野指针。
使用set方法赋值时,实质上不保留新值,也不释放旧值,只设置新值。- retain:release旧值,再retain新值(引用计数+1)
使用set方法赋值时,实质上是会先保留新值,再释放旧值,再设置新值,避免新旧值一样时导致对象被释放的的问题。- copy:release旧值,再copy新值(拷贝内容)
一般用来修饰String、Dict、Array等需要保护其封装性的对象,尤其是在其内容可变的情况下,因此会拷贝(深拷贝)一份内容給属性使用,避免可能造成的对源内容进行改动。
使用set方法赋值时,实质上是会先拷贝新值,再释放旧值,再设置新值。
实际上,遵守NSCopying的对象都可以使用copy,当然,如果你确定是要共用同一份可变内容,你也可以使用strong或retain。- assign:直接赋值,一般用来修饰基本数据类型
ARC 使得内存管理更加轻松,但是 ARC 还有以下不足:
- 不能管理 CoreFoundation 中的对象,所以对于 CoreFoundation 对象,需要我们手动来管理内存
- 不能释放循环引用的对象(这里也不算是 ARC 不足,这个是引用计数机制本身的缺点)