iOS ARC完全指南
iOS ARC完全指南OS5ARC完全指南GuanGyi Inc http://www.gungyi.com ARC完全指南最显著的变化就是增加了动引用计数)。是新编译器的特性,完全消除了手动内存管理的烦琐。在你的项目中使用是非常简单的,所有的编程都和以前一样,除了你不再调用。启用之后,编译器会自动在适当的地方插入适当的语句。你不再需要担心内存管理,因为编译器为你处理了一切。注意是编译器特性,而不是运行时特性(除指针系统),它也不是其它语言中的垃圾收集器。因此和手动内存管理性能是一样的,冇些时候还能更加快速,因为编译器还可以执行某些优化。指针保持对象的生命的规则非常简单:只要还有一个变量指向对象,对象就会保持在内存中。当指针指向新值,或者指针不再存在时,相关联的对象就会自动释放。这条规则对于实例变量属性、木地变量都是适用的我们可以按所有权( )来考虑对象: NSString firstnAme self textField text变量成为对象的指针,也就是拥有者,该对象保存了文木输入框的內容第3页/共49页OS5ARC完全指南GuanGyi Inc http://www.gungyi.com @"Ray firstName个对象可以有多个拥有者,在上面例子屮,的属性同样也是这个对象的拥有者,也就是有两个指针指向同一个对象@"Ray firstName self textField text随后用户改变了输入框的文本,此时属性就指向了新的对象。但原米的对象仍然还有一个所有者(变量),因此会继续保留在内存中。第4页/共49页OS5ARC完全指南GuanGyi Inc http://www.gungyi.com @" Ray @"Rayman firstName self textField text只有当获得新值,或者超出作用域(本地变量方法返回时、实例变量对象释放时),对象不再拥有任何所有者,计数降为,这时对象会被释放。 @"Rayman firstName self, textField text我们称和指针为,因为它们能够保持对象的生命。默认所有实例变量和本地变量都是类型的指针另外还有一种指针,变量仍然指向一个对象,但不是对象的拥有者: weak NSString *weakName= selftextFieldtext第5页/共49页OS5ARC完全指南GuanGyi Inc http://www.gungyi.com @"Rayman seLf。 textField text wakaMe变量和属性都指向一个对象,但不是拥有者。如果文本框的内容发生变化,则原先的对象就没有拥有者,会被释放,此时会自动变成,称为a Mister Dark @"Rman self textField text wakaMe变量自动变为是非常方便的,这样阻止了指针继续指向已释放对象。摇摆指针和会导致非常难于寻找的消除了类似的问题。第6页/共49页OS5ARC完全指南GuanGyi Inc http://www.gungyi.com指针主要用于父子关系,父亲拥有一个儿子的指针,因此是儿子的所有者;但为了阻止所有权回环,儿子需要使用指针指向父亲。典型例了是模式,你的通过指针拥有一个的和都是指针,指向你的seaview View Controlle「- asOurce UITableview delegat注意下面代码是有问题的: weak NSString *str= [[NSString alloc] initwithFormat:.]: NSLog(@%@, str);// will output "(null)"对象没有拥有者(指针),在创建之后就公被立即释放会给出警告(变量默认就是类型的,因此一般我们对于变量不加修饰,以下两者是等价的NSString firstnAme self textField text strong NSString *firstName self textField text第7页/共49页OS5ARC完全指南GuanGyi Inc http://www.gungyi.com属性可以是写法如下@property (nonatomic, strong ) NSString *firstName @property (nonatomic, weak) id <My Delegate>delegate;有,我们的代码可以清晰很多,你不再需要考虑什么时候或对象。唯一需要考虑的是对象之间的关联,也就是哪个对象拥有哪个对象?以下代码在之前是不可能的,在手动内存管理中,从中移除一个对象会使对象不可用,对象不属于时会立即被释放。随后打印该对象就会导致应用崩溃。 id ob]= [array objectAtIndex: 0]; [array removeObjectAtIndex: 0]; SLOg(@"地@",obj);在中这段代码是完全合法的,因为变量是一个指钅它成为了对象的拥有者,从中移除该对象也不会导致对象被释放也有一些限制。首先能工作于对象,如果应用使用了此时需要你来管理内存。此外还有其它一些更为严格的语言规则,以确保能够正常地工作。不过总的来说,无疑利大于弊!星然管理了和但并不表示你完全不需要处理内存管理的问题。因为指针会保持对象的生命,某些情况下你仍然需要手动设置这些指针为,否则可能导致应用内存不足。无论第8页/共49页OS5ARC完全指南GuanGyi Inc http://www.gungyi.com何时你创建一个新对象时,都需要考虑谁拥有该对象,以及这个对象需要存活多久亳无疑问,是的未来!鼓励开发者将手动内存管理迁移至,同时新项目也推荐使用可以产生更简洁的代码,和更健壮的应用。有」,内存相关的崩溃已经成为过去!不过现在正处于手动内存向自动内存管理的过渡期,你仍然会经常退到与尚不兼容的代码(你自己的代码或第三方库)。幸运的是,你可以在同一个项目中组合使用和非代码,同时还提供白动迁移工具还能很好地结合使用,这对游戏开发是非常有帮助的。对有一点点限制( ),但也没太大关系Xcode的ARC自动迁移要启用一个项目的,你有以下几种选择1. Xcode带了一个自动转换工具,可以迁移源代码至ARC你可以手动转换源文件3.你可以在Xcode中禁用某些文件使用ARC,这点对于第三方库非常有用。 Xcode的自动迁移工具ARC是LLⅧM3.0编译器的特性,而现有工程可能使用老的GCC4.2或LLVM-GCC编译器,因此首先需要设置使用LLWM3.0编详器第9页/共49页OS5ARC完全指南GuanGyi Inc http://www.gungyi.com Project Settings-〉 target-〉 Build settings,在搜索框中输入compiler,就可以列出编译器选项设置: 4 ARtist PROJECT ummary Info Build Settings Build paases Build rules Art sts Basic all(combincd levels Default compiler Apple LlvM compiler 3.0) TARGETS Setting :A. sts Y Build Options TLLVM GCC 4.2-Warnings ectlve-C LVM.2 piler A Other Warning Flags Duer另外最好也选上Warnings中的Other Warning Flags为-Wall,这样编译器就会检查所有可能的警告,有助于我们避免潜在的问题同样, Build Options下面的Run Static Analyzer选项也最好启用,这样每次Xcode编译项目吋,都会运行静态代码分析工具来检查我们的代码Artists PROJECT Summary Info Build Settings Build Phases Build rules Art sts Basic (AlD(Cornbined Levels az static analyzer Setting h,Ais青s TARGETS Art sts Run Static Analyze Yes T Build settings下面,选择“A1”,搜索框输入" automatlc",可以没置0 bjective-C Automatic Reference Counting"选项为Yes,不过Ⅹcode自动转换工具会自动设置这个选项,这里只是告诉你如何手动设置而已。 Xcode的ARC自动转换工具:Edit Refactor Convert to0 bjective-CARC第10页/共49页
1.19MB
文件大小:
评论区