一.Automatic Reference Count(ARC)

1.介绍

 1>ARC也就是自动引用计数,是自IOS 5之后增加的新特性,编译器会在适当的地方插入适当的retaini、release、autorelease内存管理代码,完全消除了手动管理内存的繁琐。


 2>ARC是OC的编译器特性,而不是IOS运行时特性,它也不类似其他语言中的垃圾回收器。就是在编译器编译代码的时候,在适当的地方插入适当的内存管理代码。



 3> ARC和手动内存管理性能是一样的,有时还能更加快速,因为编译器还可以执行某些优化。




二.基本原理



1.ARC的判断准则:只要还有一个强指针变量指向对象,对象就会保持在内存中,反之对象将被销毁。



2.__strong和__weak修饰符:

 1>这两个修饰符用于OC对象类型的指针变量。


 2>强指针:默认情况下,所有的指针都是强指针(被__strong修饰)。


 3>弱指针:被 __weak修饰的指针。弱指针指向的对象被回收后,弱指针会自动设置为nil指针,不会引发野指针错误。



 4>weak的使用场合

解决当两端循环引用问题:

 1)一端用__strong修饰,另一端用__weak修饰。


 2)如果是使用@property自动生成,则一端用strong参数,一端用weak参数。



 5>修饰变量语法:

 1)类名 * 修饰符 变量名;

 2)修饰符 类名 *变量名;



三.和手动内存管理的区别



1.@property的参数

strong: 成员变量是强指针。

weak:成员变量是弱指针。

assign:适用于非OC对象。

以前的retain改为用strong。其他一切不变。


2.自定义的dealloc方法,不需要调用[super dealloc];


3.不能实现和调用retain、release、retainCount和autorelease等相关方法;


4.开发者不能使用NSAutoreleasePool对象。ARC下使用@autoreleasepool


5.ARC的方法命名规则


 1>对象生成和持有的方法必须是alloc,new,copy,mutableCopy等开头的方法(ARC和非ARC都是这样),特别的init开头的方法必须是实例方法,且必须要返回对象。



 2>基于上述规则,访问器方法不能已new,init(注意initiaize这样的不属于这个规则之内的,initMyObject这样的才算),copy等开头。比如你不能声明一个已new开头的属性,除非你给你指定一个getter。内部参数没有这个限制 。

如果你这么做了,在编译的时候会提示:

property's synthesized getter follows Cocoa naming convention for returning 'owned’ objects

原 因是:You take ownership of an object if you create it using a method whose name begins with “alloc”, “new”, “copy”, or “mutableCopy”.




四.Xcode的ARC转换功能。



1.Edit —>Refactor(重构) —>Convert to Objective-C ARC(转换成ARC)

怎么看项目是不是默认ARC


2.我们新建项目默认是ARC环境,有的第三方框架不支持ARC的话,编译会报错。

解决方法:

只需要告诉编译器哪些文件不需要ARC就可以了

Build Phases —>Compile Sources 中双击不需要ARC的文件添加参数

-fno-objc-arc。如果需要ARC使用参数:-f-objc-arc。