OC中关于ARC的总结

什么是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中?


在ARC中兼容MRC文件

如何将整个MRC程序转换为ARC程序?


将整个MRC程序转换为ARC程序
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。