什么是ARC?
Automatic Reference Counting,自动引用计数,即ARC.
顾名思义:系统自动的帮助我们去计算对象的引用计数器的值.
可以说是WWDC2011和iOS5引入的最大的变革和最激动人心的变化.
ARC是新的LLVM3.0编译器的一项特性,使用ARC,可以说一举解决了广大iOS开发所憎恨的手动管理内存的麻烦.
在程序中使用ARC非常简单,只需要像往常那样编写代码,只不过永远不要写retain、release、autorelease这三个关键字就好,永远不要手动在dealloc中使用[super dealloc],这是ARC的最基本的原则.
在ARC开启时,编译器会自动的在合适的地方插入retain、release和autorelease代码.
在默认情况下,Xcode开启ARC机制,在ARC机制下,不允许调用retain、release、retainCount、autorelease方法,
ARC机制下,对象何时被释放?
本质:对象的引用计数器为0的时候,自动释放.
表象:只要没有强指针指向这个对象,这个对象就会立即回收.
强指针与弱指针?
强指针:默认情况下,我们声明一个指针,这个指针就是一个强指针,我们也可以使用__strong来显示的声明这是一个强指针.
弱指针:使用__weak标识的指针就叫做弱指针.
无论是强指针还是弱指针,都是指针,都可以用来存储地址,这一点没有任何区别,都可以通过这个指针访问对象的成员,它们唯一的区别就在于在ARC模式下,他们用来作为回收对象的基准.
如果一个对象没有任何强类型的指针指向这个对象的时候,对象就会被自动释放.
不能创建对象用一个弱指针存储这个对象的指针,这样的话,刚创建出来的对象,就没有任何强指针指向,创建出来就会被回收.
__weak Person *p =[[Person alloc]init];
在ARC机制下,当对象被回收的时候,原来指向这个对象的弱指针就会被自动设置为nil.
Person *p1 =[[Person alloc]init];//p1的值为0x11901
__weak Person *p2 = p1;//p2的值也为0x11901
p1 = nil;//p1指针指向nil并且p2指针为弱指针,所以对象被回收
[p2 sayHi];//因为对象被回收了,弱指针p2会被自动设置为nil,nil调用任何东西都不会有任何反应,所以这句代码不会报僵尸对象错误.
什么情况下叫做对象没有强指针指向?
1). 指向对象的强指针被回收.
2). 指向对象的强指针被赋值为nil.
ARC中的属性修饰符:strong、weak
因为在ARC机制下,属性修饰符retain是不能使用的,取而代之的是strong.
使用建议:
在ARC机制下,strong和weak都是应用在属性的类型是OC对象的时候,并且绝大多数情况下使用strong来修饰,weak是用来解决ARC中的循环引用问题.属性的类型不是OC对象的时候就使用assign来修饰.
ARC机制下的循环引用?
在ARC机制下.当两个对象相互引用的时候,如果两边都使用strong来修饰,那么就会出现内存泄露,因为互相都强引用了.
Person *p1 =[[Person alloc]init];
Book *b1 =[[Book alloc]init];
p1.book = b1;
b1.owner = p1;
解决方案:一端使用strong一端使用weak
在Book类中
@property(nonatomic,weak)Person *owner;
在Person类中
@property(nonatomic,strong)Book *book;
@property参数总结
1.开发程序分为ARC和MRC.
2.与多线程相关的参数,atomic:默认值,安全,但是效率低下,nonatomic:不安全,但是效率高.
无论在ARC还是在MRC都可以使用,建议都使用nonatomic.
3.retain只能在MRC的模式下使用,代表生成的setter方法是标准的内存管理代码.当属性的类型是OC对象的时候,绝大多数情况下使用retain,只有在出现了循环引用的时候,一边使用retain,另一边使用assign.
4.assign,在ARC和MRC的模式下都可以使用assign,当属性的类型是非OC对象的时候,使用assign.
5.strong,只能使用在ARC机制下,当属性的类型是OC对象类型的时候,绝大多数情况下使用strong,只有出现了循环引用的时候,一端使用strong,一端使用weak.
6.weak,只能使用在ARC机制下,当属性的类型是OC对象的时候并且出现了循环引用,一端使用strong,一端使用weak.
7.readonly readwrite无论是ARC还是MRC都可以使用.
8.setter、getter无论在ARC还是在MRC下都可以改.
总结:原来MRC使用retain现在在ARC机制下使用strong,出现循环引用的时候,MRC一边使用retain,一边使用assign,ARC是一边使用strong,一边使用weak.
如何兼容MRC文件在ARC中?
如何将整个MRC程序转换为ARC程序?