logo资料库

iOS ARC 完全指南.pdf

第1页 / 共49页
第2页 / 共49页
第3页 / 共49页
第4页 / 共49页
第5页 / 共49页
第6页 / 共49页
第7页 / 共49页
第8页 / 共49页
资料共49页,剩余部分请下载后查看
ARC完全指南
指针保持对象的生命
Xcode的ARC自动迁移
Xcode的自动迁移工具
转换后的其它问题
禁止某些文件的ARC
ARC自动迁移的常见问题
属性property
IBOutlet
readonly property
autorelease、release、retain调用
dealloc方法
AutoreleasePool
Toll-Free Bridging
Delegate 和 Weak Property
unsafe_unretained
iOS 4中使用ARC
ARC高级指南
Blocks与ARC
Singleton与ARC
Autorelease和AutoreleasePool
Cocos2D 和 Box2D
静态库static library
最后?
参考资料
iOS 5 ARC 完全指南 书籍:《iOS 5 By Tutorials》 翻译:Kevin 联系:support@gungyi.com 网站:http://www.gungyi.com 鸣谢:GungYi 移动应用开发 CocoaChina 社区 时间:2012-02-09
iOS 5 ARC 完全指南 GungYi Inc http://www.gungyi.com 目录 ARC 完全指南 ................................................................................................................ 3 指针保持对象的生命............................................................................................. 3 Xcode 的 ARC 自动迁移 ......................................................................................... 9 Xcode 的自动迁移工具 ................................................................................... 9 转换后的其它问题........................................................................................ 14 禁止某些文件的 ARC .................................................................................... 14 ARC 自动迁移的常见问题 ............................................................................ 15 属性 property ....................................................................................................... 17 IBOutlet .......................................................................................................... 18 readonly property .......................................................................................... 19 autorelease、release、retain 调用 ..................................................................... 19 dealloc 方法 .......................................................................................................... 20 AutoreleasePool .................................................................................................... 20 Toll-Free Bridging .................................................................................................. 21 Delegate 和 Weak Property ................................................................................ 26 unsafe_unretained ................................................................................................ 27 iOS 4 中使用 ARC .................................................................................................. 27 ARC 高级指南 .............................................................................................................. 28 Blocks 与 ARC ........................................................................................................ 28 Singleton 与 ARC ................................................................................................... 34 Autorelease 和 AutoreleasePool .......................................................................... 40 Cocos2D 和 Box2D .............................................................................................. 45 静态库 static library .............................................................................................. 48 最后?................................................................................................................... 49 参考资料............................................................................................................... 49 第 2 页 / 共 49 页
iOS 5 ARC 完全指南 GungYi Inc http://www.gungyi.com ARC 完全指南 iOS 5 最显著的变化就是增加了 Automatic Reference Counting(自 动引用计数)。ARC 是新 LLVM 3.0 编译器的特性,完全消除了手动内 存管理的烦琐。在你的项目中使用 ARC 是非常简单的,所有的编程都 和以前一样,除了你不再调用 retain, release, autorelease。启用 ARC 之后,编译器会自动在适当的地方插入适当的 retain, release, autorelease 语句。你不再需要担心内存管理,因为编译器为你处理了 一切。注意 ARC 是编译器特性,而不是 iOS 运行时特性(除了 weak 指 针系统),它也不是其它语言中的垃圾收集器。因此 ARC 和手动内存 管理性能是一样的,有些时候还能更加快速,因为编译器还可以执行某 些优化。 指针保持对象的生命 ARC 的规则非常简单:只要还有一个变量指向对象,对象就会保持 在内存中。当指针指向新值,或者指针不再存在时,相关联的对象就会 自动释放。这条规则对于实例变量、synthesize 属性、本地变量都是适 用的。 我们可以按“所有权”(ownership)来考虑 ARC 对象: NSString *firstName = self.textField.text; firstName 变量成为 NSString 对象的指针,也就是拥有者,该对象 保存了文本输入框的内容。 第 3 页 / 共 49 页
iOS 5 ARC 完全指南 GungYi Inc http://www.gungyi.com 一个对象可以有多个拥有者,在上面例子中,UITextField 的 text 属 性同样也是这个 String 对象的拥有者,也就是有两个指针指向同一个对 象: 随后用户改变了输入框的文本,此时 text 属性就指向了新的 String 对象。但原来的 String 对象仍然还有一个所有者(firstName 变量), 因此会继续保留在内存中。 第 4 页 / 共 49 页
iOS 5 ARC 完全指南 GungYi Inc http://www.gungyi.com 只有当 firstName 获得新值,或者超出作用域(本地变量方法返回 时、实例变量对象释放时),String 对象不再拥有任何所有者,retain 计数降为 0,这时对象会被释放。 我们称 firstName 和 textField.text 指针为“strong”,因为它们能够保 持对象的生命。默认所有实例变量和本地变量都是 strong 类型的指针。 另外还有一种“weak”指针,weak 变量仍然指向一个对象,但不是对 象的拥有者: __weak NSString *weakName = self.textField.text; 第 5 页 / 共 49 页
iOS 5 ARC 完全指南 GungYi Inc http://www.gungyi.com weakName 变量和 textField.text 属性都指向一个 String 对象,但 weakName 不是拥有者。如果文本框的内容发生变化,则原先的 String 对象就没有拥有者,会被释放,此时 weakName 会自动变成 nil,称为 “zeroing” weak pointer: weak 变量自动变为 nil 是非常方便的,这样阻止了 weak 指针继续 指向已释放对象。“摇摆指针”和“zombies”会导致非常难于寻找的 Bug。 zeroing weak pointer 消除了类似的问题。 第 6 页 / 共 49 页
iOS 5 ARC 完全指南 GungYi Inc http://www.gungyi.com weak 指针主要用于“父-子”关系,父亲拥有一个儿子的 strong 指针, 因此是儿子的所有者;但为了阻止所有权回环,儿子需要使用 weak 指 针指向父亲。典型例子是 delegate 模式,你的 View Controller 通过 strong 指针拥有一个 UITableView,Table view 的 data source 和 delegate 都是 weak 指针,指向你的 View Controller。 注意下面代码是有问题的: __weak NSString *str = [[NSString alloc] initWithFormat:...]; NSLog(@"%@", str); // will output "(null)" String 对象没有拥有者(weak 指针),在创建之后就会被立即释放。 Xcode 会给出警告("Warning: assigning retained object to weak variable; object will be released after assignment") 变量默认就是__strong 类型的,因此一般我们对于 strong 变量不加 __strong 修饰,以下两者是等价的: NSString *firstName = self.textField.text; __strong NSString *firstName = self.textField.text; 第 7 页 / 共 49 页
iOS 5 ARC 完全指南 GungYi Inc http://www.gungyi.com 属性可以是 strong 或 weak,写法如下: @property (nonatomic, strong) NSString *firstName; @property (nonatomic, weak) id delegate; 有了 ARC,我们的代码可以清晰很多,你不再需要考虑什么时候 retain 或 release 对象。唯一需要考虑的是对象之间的关联,也就是哪 个对象拥有哪个对象? 以下代码在 ARC 之前是不可能的,在手动内存管理中,从 Array 中 移除一个对象会使对象不可用,对象不属于 Array 时会立即被释放。随 后 NSLog()打印该对象就会导致应用崩溃。 id obj = [array objectAtIndex:0]; [array removeObjectAtIndex:0]; NSLog(@"%@", obj); 在 ARC 中这段代码是完全合法的,因为 obj 变量是一个 strong 指针, 它成为了对象的拥有者,从 Array 中移除该对象也不会导致对象被释放。 ARC 也有一些限制。首先 ARC 只能工作于 Objective-C 对象,如果 应用使用了 Core Foundation 或 malloc()/free(),此时需要你来管理内 存。此外 ARC 还有其它一些更为严格的语言规则,以确保 ARC 能够正 常地工作。不过总的来说,ARC 无疑利大于弊! 虽然 ARC 管理了 retain 和 release,但并不表示你完全不需要处理 内存管理的问题。因为 strong 指针会保持对象的生命,某些情况下你 仍然需要手动设置这些指针为 nil,否则可能导致应用内存不足。无论 第 8 页 / 共 49 页
分享到:
收藏