一.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。