`
hotfm
  • 浏览: 51086 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Automatic Reference Counting (ARC)

阅读更多

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中的红色箭头,就会自动跳到code中对应的变量声明处,根据情况加上weak关键字就解决leak了。
在新旧技术更替的更年期应注意:现在ARC还under NDA,没有任何开源框架可以公开支持ARC的,如果想使用此特性,在选取开源框架时应该尽量选择使用CF库较少的框架,否则手动爆开源框架的菊花会很痛苦。
分享到:
评论

相关推荐

    ARC (Automatic Reference Counting)自动引用计数的使用详解

    详细介绍了IOS中ARC的使用方法。一看便懂 。

    Programming in Objective-C 4th Edition Stephen G. Kochan

    The fourth edition of this book has been updated to cover the significant changes that first appeared in iOS 5 and Xcode 4.2, including the use of Automatic Reference Counting (ARC) to improve and ...

    iOS开发系列-ARC浅解

     所谓ARC是Automatic Reference Counting , 即自动引用计数。ARC是自iOS5引入的。ARC机制的引入是为了简化开发过程的内存管理的。相对于之前的MRC (Manual Reference Counting) , ARC机制显得更加自动化。在使用...

    Object-C语言教程&案例,要点难点,代码示例,代码解析

    内存管理:了解ARC(Automatic Reference Counting,自动引用计数)和MRC(Manual Reference Counting,手动引用计数)的工作原理。 Foundation框架:学习Foundation框架中提供的常用类,如NSString、NSArray、...

    Programming in Objective-C, 第四版,ePub格式

    17 Memory Management and Automatic Reference Counting (ARC) 18 Copying Objects 19 Archiving Part III: Cocoa, Cocoa Touch, and the iOS SDK 20 Introduction to Cocoa and Cocoa Touch 21 Writing iOS ...

    The Swift Programming Language_笔记

    通过ARC(Automatic Reference Counting,自动引用计数)来简化内存管理。我们的框架栈则一直基于Cocoa。Objective-C进化支持了块、collection literal和模块,允许现代语言的框架无需深入即可使用。(by gashero)感谢...

    iOS 弹出式菜单 MGTileMenu.zip

    iOS 弹出式菜单 MGTileMenu ,这个控件基于iOS 5开发,使用了ARC(Automatic Reference Counting)...

    EhLib_9.2_Build_9.2.020_Evaluation_version

    + Supports of ARC (Automatic Reference Counting) Delphi compilers + Compatibility with the CrossVCL library. Now you can compile your VCL project into a GUI application for OS X and Linux. + ...

    Programming in Objective-C(最新第四版)

    The fourth edition of this book has been updated to cover the significant changes that first appeared in iOS 5 and Xcode 4.2, including the use of Automatic Reference Counting (ARC) to improve and ...

    swift中文教程

    使用自动引用计数(Automatic Reference Counting, ARC)来简化内存管理。我们在 Foundation 和 Cocoa 的 基础上构建框架栈使其完全现代化和标准化。 Objective-C 本身支持块、集合语法和模块,所以框架可以轻松支 ...

    Apple Swift编程语言入门教程.doc

    通过ARC(Automatic Reference Counting,自动引用计数)来简化内存管理。我们的框架栈则一直基于Cocoa。Objective-C进化支持了块、collection literal和模块,允许现代语言的框架无需深入即可使用。(by gashero)感谢...

    Objective C Memory Management Essentials(PACKT,2015)

    You will also see what ARC (Automatic Reference Counting) is and how it helps in memory management. Finally, you will cover examples on how to use the various tools provided by Xcode to help in ...

    ios开发技巧总结.docx

    ios开发 iOS开发涵盖了许多方面,以下是一些关键的开发技巧和最佳实践: 熟悉Swift或Objective-C:Swift是苹果...内存管理:理解ARC(Automatic Reference Counting)自动引用计数机制,避免内存泄漏和循环引用问题。

    Application Development with Swift(PACKT,2015)

    Swift has simplified its memory management with Automatic Reference Counting (ARC) and it is compatible with Objective-C. This book has been created to provide you with the information and skills ...

    swift开发文档中文版

    我们使用自动引用计数(Automatic Reference Counting, ARC)来简化内存管理。我们在 Foundation 和 Cocoa的基础上构建框架栈并将其标准化。Objective-C 本身支持块、集合语法和模块,所以框架可以轻松支持现代编程...

    swift编程语言教程 2014 官方正式版.zip

    5.通过ARC(Automatic Reference Counting,自动引用计数)来简化内存管理。我们的框架栈则一直基于Cocoa 6.Objective-C进化支持了块、collection literal和模块,允许现代语言的框架无需深入即可使用 7.集成了现代...

    Objective-C学习之ARC的实现方法

    自动引用计数(Automatic Reference Counting, ARC)把压在程序员们肩头的管理内存的重担卸除了不少,更不用说让跟踪内存泄漏那样的烦心事也少了很多。下面这篇文章主要给大家介绍了关于Objective-C学习之ARC的实现...

    详解优化iOS程序性能的25个方法

    ARC(Automatic ReferenceCounting, 自动引用计数)和iOS5一起发布,它避免了最常见的也就是经常是由于我们忘记释放内存所造成的内存泄露。它自动为你管理retain和release的过程,所以你就不必去手动干预了。忘掉代码...

    OCBorghettiView手风琴式折叠菜单特效

    OCBorghettiView手风琴式折叠菜单特效,源码OCBorghettiView,OCBorghettiView可实现手风琴式折叠菜单效果,设计可重新使用,适合iPhone和iPad应用,使用ARC (Automatic Reference Counting),支持设备旋转,同时还...

    The Swift Programming Language(pdf和epub两种)

     Swift经过了数年的酝酿,Apple通过改进现有的编译器、调试器和框架结构奠定了Swift的基础,并通过Automatic Reference Counting(ARC)简化了内存管理。Swift的框架建立在坚实的Foundation和Cocoa上,已实现现代化...

Global site tag (gtag.js) - Google Analytics