这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战
ARC
ARC是新的LLVM3.0编译器的一项特性,在工程中使用非常简单,不用再写release
、retain
、autorelease
三个关键字。当开启ARC时,编译器
将自动在代码合适的地方插入release
、retain
和autorelease
。
ARC注意点和优点
-
ARC注意点
- ARC是编译器的特性,而不是运行时的特性
- ARC不是其他语言中的垃圾回收,有着本质区别,其他语言是定时查看,ARC就是写好的代码,直接执行就可以
-
ARC优点
- 完全消除了手动管理内存的繁琐
- 基本上能够避免内存泄漏
- 有时还能更加快速,因为编译器还可以执行某些优化
-
ARC的判断原则
只要没有强指针指向对象,对象就会被释放
-
强指针
//默认所有指针变量都是强指针 Person *p = [[Person alloc]init];
//被_strong修饰的指针 __strong Person *p = [[Person alloc]init];
-
弱指针(在开发中,千万不要使用一个弱指针保存刚刚创建的对象,会被立即释放)
//被__weak修饰的指针 __weak Person *p = [[Person alloc]init];
-
循环引用
由于对象间彼此引用,无法释放,所以,循环引用会引发内存泄漏
-
如果A对象拥有B对象,而且B对象又拥有A对象,此时会形成循环
retain
@class Animal; @interface Person : NSObject @property (nonatomic,strong) Animal *animal; @end @class Person; @interface Animal : NSObject @property (nonatomic, strong) Person *person; @end
-
如何解决这个问题,不要让A retain B, B retain A ARC中保存对象不用
assign
,用weak
,assign
是专门用于保存基本数据类型的,保存对象用weak
@class Animal; @interface Person : NSObject @property (nonatomic,strong) Animal *animal; @end @class Person; @interface Animal : NSObject @property (nonatomic, weak) Person *person; @end