NSObject *obj = [[NSObject alloc] init];
// do some stuff
ARC会自动将它变成:
NSObject *obj = [[NSObject alloc] init];
// do some stuff
[obj release]; // **Added by ARC**
三、在工程中开启ARC
1. 对象的Alloc/Init
创建对象的方法跟以前一样,但你一定不能调用retain/release/autorelease/retainCount。也不能通过selector偷偷地调用它们: 禁止使用@selector(retain)和@selector(release)。
2. dealloc方法
ARC为自动为你调用,一定不能直接调用dealloc。不过,如果你需要释放实例变量以外的资源,还是可以创建自定义的dealloc方法。但在这个方法里,不要调用[super dealloc]。因为ARC会帮你调。
3. 声明的属性
在ARC之前,我们是用@property指令中的assign/retain/copy参数来告诉编译器,如何管理这些属性的内存。用了ARC之后,这些参数就作废了,改用weak/strong这两个参数。
4. ARC准则:只要没有强指针(strong)指向对象,就会释放对象。
五、ARC限定符,声明的属性(strong、 weak)
1.强引用(指针)是对某对象的引用,并且能阻止它被回收。换句话说,强引用创建了一个所有关系。(默认情况下,所有指针都是强指针。)
在ARC之前,我们这么写:
// Non-ARC Compliant Declaration
@property(retain) NSObject *obj;
在ARC下,我们需要这么写,以确保当前实例获得被引用对象的所有权(主人不被回收,它也不能被回收)。
// ARC Compliant Declaration
@property(strong) NSObject *obj;
2.
弱引用是对某对象的引用,但不能阻止它被回收。(只要弱指针指向对象不存在,弱指针就会清空)
换句话说,弱引用并不会创建所有关系。在ARC之前,我们这么写:
// Non-ARC Compliant Declaration
@property(assign) NSObject *parentObj;
在ARC下,我们需要这么写,以确保当前实例没有获得被引用对象的所有权(一般来说,子对象不应该拥有父对象,这时可以用弱引用)。
// ARC Compliant Declaration
@property(weak) NSObject *parentObj;
- __strong: 默认限定符,不需要显式指定。表示任何用alloc/init创建的对象在当前范围的生命期内得以保留。“当前范围”是指变量声明语句所在的两个大括号之间(方法、循环、块,等等)。
- __weak: 表示对象可以随时被摧毁。只有当它被其它对象强引用时才有用。__weak变量在摧毁时,被设为nil。__weak Person *p2 = p;
六、移植到ARC
1、打开不兼容ARC的工程,进入Edit > Refactor > Convert to Objective-C ARC。
2、选择需要转换的构建目标和文件(在后续步骤排除不需要转换的文件)
3、运行预查,按下一步。
4、检查一下工具建议的修改,并选择是否要排除某个文件。然后按下保存。
七、引入不兼容的ARC代码
我们可以让一部分文件用ARC,另一部分文件不用。
步骤如下:
- 在Xcode的工程树上,点击你自己的工程
- 点击Target
- 选择Build Phases标签
- 展开Compile Sources
- 选择需要排除在ARC外的文件
- 按下回车
- 输入-fno-objc-arc
- 再按下回车
- 现在,你选中的文件都有了-fno-objc-arc编译器标识,会被排除在ARC之外
- 当两端循环引用时,解决方案(非ARC): 一端用retain, 一端用assign
- 当两端循环引用时,解决方案(ARC): 一端用strong,一端用weak