5.1 Objective-C 的 ARC 基础入门
5.1.1 历史简介
5.1.2 手动引用计数与自动引用计数
5.2 什么是ARC
ARC 是可以为你自动插入 retain 和 release 语句的编译器专属功能,虽然ARC 是随着 IOS5 一同发布的,但是通过 ARC 编译的应用也可以在 IOS4 设备上运行。
混合搭配支持 ARC 与 不支持ARC 的代码,方法是通过 -fno-objc-arc 和 -fobjc-arc 两个编译器标志。甚至可以在类中混合搭配使用支持 ARC 与 不支持 ARC的代码!
编译时支持 ARC 而文件的代码不支持 ARC:
# !_has_feature(objc-arc) //这里是不支持 ARC 的代码 - (void) release { //在这里释放变量 } #endif
Clang 语言扩展 _has_feature 类函数宏非常强大。可以支持任何支持Clang 语言特征并符合相应条件的代码进行条件编译。
5.2.1 在 ARC 工程中集成非 ARC 的第三方代码
1) 使用 -fno-objc-arc 编译器开关
2)用 XCode 的 Convert to Objective-C ARC 工具(其实该工具会自动为排除的文件添加 -fno-objc-arc)
5.2.3 ARC 所有权修饰符
ARC 会自动帮你插入 retain 和 release 语句。不过“自动”代码生成器需要一些提示来了解销毁已分配内存的准确时机。ARC通过指定的所有权修饰符来确定指针的生命周期。ARC 支持 4 种所有权修饰符:
- __strong:
- __weak:与__unsafe_unretained 修饰符非常相似,只是当指针指向内容被销毁后,弱指针便会变成空值(nil),此外,该属性支持IOS5以及以上的系统。
- __unsafe_unretained:当你没有指针但想要保存指向某物体的引用时,可以使用该修饰符。类似于在 ARC 中使用 assign
- __autoreleasing : 可以在想要从方法返回一个自动释放的变量时使用。与上面三个修饰符的重要区别是该修饰符无法用在属性上。
在 Xcode4.2/LLVM 3 中,栈变量的默认所有权修饰符是 __strong,属性的则是 __assign。而在 Xcode4.3/LLVM3.1 及更高版本中,属性的默认所有修饰权也别改成了 __strong。还有,所有权修饰符与常量修饰符不同,它是位置无关的。因此 __weak NSObject myObject; 和 NSObject __weak MyObject; 意义是一样的。
5.2.4 ARC 空声明变量
使用 ARC 的另一个优势是所有未初始化的变量默认都是“空值化”的。不过注意,与其他高级编程语言不同,ARC 不会自动将标量的值设置为零。