Xcode_ARC详解全攻略.docVIP

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Xcode_ARC详解全攻略

Xcode ARC详解全攻略 ios5中,有个很吸引眼球的特性就是“Automatic Reference Counting”,简单来说就是内存自动回收,看起来似乎是平时开发中遇到的各种内存问题的福音,仔细了解了一下,似乎没有那么美好:1、需要iOS5才支持;2、很多引用的类库暂时还不支持.麻烦的是对大多数第三方库需要加禁用arc的编译flag,因为大多都因为兼容性还在使用手动内存管理。 iOS上内存管理一直让人很头疼. 手动管理内存经常忘掉release或autorelease,或者因为release多了、retain少了导致空指针引用程序崩溃,还要经常按COMMAND+SHIFT+B,岂止头疼,简直蛋疼有木有。 虽然objective-c 2.0支持垃圾收集器(Garbage Collection,简称GC),但是垃圾收集器只能在MAC程序上开启,ios上没办法用。就算在MAC应用程序上可以用,GC也会有性能上的损耗。 现在LLVM3.0多了一个给力的新东西,叫Automatic Reference Counting。开启这个选项之后,LLVM会在编译阶段自动帮开发者完成“手动”的内存管理。同时,所有代码中的retain,release和 autorelease会被标记成错误,也就是说,我们完全不需要用以前头蛋俱疼的方式管理内存了。 ARC不仅可以修复错误,还能增强性能。根据WWDC 2011大会的介绍,retain/release快了2.5倍,@autoreleasepool快了6倍,objc_msgSend快了33%。 一、旧工程开启ARC的方法 xCode4.2中已经自带了LLVM3.0,在用新的模板建立工程时,编译器默认选择LLVM3.0,并且开启ARC。如图。 xCode4.2 也为ARC提供了自动转换工具。首先将工程的编译器切换为LLVM3.0,然后在菜单里选择Edit—-Refactor—-Convert to Objective-C ARC…。LLVM会将不能转换的部分标记为错误,要求我们手动修改。一般NSAutoReleasePool不能自动转换,要手动转为 @autoreleasepool。CF框架的方法也不能自动转换,而release、retain和autorelease是可以自动转换的。我们将不 能自动转换的错误手动修改好后,编辑器将完成自动转换。 对 于可能出现的错误,WWDC 2011的视频中给出了一些例子。比如用static?count来处理singletons pattern;用weak来申明delegate pattern;用dispatch_once来保证多线程的安全;在case关键字后面加上大括号{..}来限制case里面申明变量的作用范围等等。 二、开启ARC后需要遵循的原则 1、不能调用retain/release/autorelease,这些由编译器来完成。 2、结构内不能有对象指针,如果结构中包含,则需要以类代替结构。 3、不能使用id–void *的类型转换,因为编译器不知道这个void *是否需要retained。 4、不能使用NSAutoreleasedPool,要用@autoreleasepool {……}来代替。 三、ARC中引入的四个新的关键字 1、Strong Reference,强引用。默认类型,不加任何关键字(也可以写成__strong)。相当于之前代码中的retain属性。 2、Autoreleasing Reference,自动释放引用。通常出现在例如系统error处理函数中(关键字__autoreleasing),描述out-parameters用,只保存在栈中,不太常用。 3、Unsafe Reference,不安全引用。类似于之前代码中的assign属性,不分配内存(关键字__unsafe_unretained),相当于起了个别名。 4、Weak Reference,弱引用。前面提到过,不增加计数,当对象开始释放时,立刻设置成nil。 四、ARC中循环引用造成内存泄露的原因与解决办法 ARC通过记录指向某对象的指针数量来判断该对象是否应该被释放(0代表可以释放)。因而如果出现循环引用,就会出现内存泄露。如下图所示。 ?取消3-2的引用 ??导致泄露。 ARC的解决办法也和简单,使用弱引用(weak reference)。弱引用的申明方式举例如下: id?__weak?P; @property (weak)?NSVIew *V; 还是以上面的例子做对比,结果如下: ?弱引用不增加计数,?从而消除leak。 五、Instruments的Leaks的新功能 这张图里面就标识出了整个leak cycle的全景图。点击cycle graph中的红色箭头,就

文档评论(0)

yaobanwd + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档