`
hotfm
  • 浏览: 52556 次
  • 性别: 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的使用方法。一看便懂 。

    深入剖析 Swift 中的自动引用计数(ARC)机制

    在 Swift 编程语言中,自动引用计数(Automatic Reference Counting,简称 ARC)扮演着至关重要的角色,它负责自动管理内存,确保应用程序的高效运行和稳定性。本文将深入探讨 ARC 的工作原理、如何避免常见的内存...

    深入 Swift 的自动引用计数(ARC):内存管理的高效策略

    Swift 语言的自动引用计数(Automatic Reference Counting,简称 ARC)是一种先进的内存管理技术,用于在编译时自动插入引用计数代码,以确保应用程序不会消耗过多内存或导致内存泄漏。本文将详细探讨 ARC 的工作...

    Swift 中的并发和多线程是如何管理的

    在 Swift 中,内存管理主要依赖于自动引用计数(Automatic Reference Counting, ARC)。ARC 自动跟踪对象的引用数量,并在适当的时候释放内存。Swift 5.5 引入了新的并发特性,使得编写多线程代码变得更加简单和安全...

    xcode报错SDK does not contain 'libarclite' at the path

    然而,开发者们时常会遇到各种各样的错误,其中“SDK does not contain 'libarclite' at the path”是一个常见的问题,主要与Apple的Automatic Reference Counting (ARC)机制有关。本文将深入探讨这个错误的原因、...

    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 ...

    Swift 语言的内存管理机制解析

    Swift 语言的内存管理主要依赖于自动引用计数(Automatic Reference Counting,简称 ARC)。这是一种编译器自动实现的内存管理机制,它通过跟踪对象的引用计数来自动管理内存。当一个对象的引用计数降至零时,ARC 会...

    iOS 5 ARC完全指南

    《iOS 5 ARC完全指南》深入解析了自动引用计数(Automatic Reference Counting,简称ARC)在iOS开发中的应用与工作原理。ARC是苹果在iOS 5中引入的一项技术革新,旨在简化内存管理,减少开发者在手动管理内存时可能...

    The Swift Programming Language_笔记

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

    ARC和非ARC模版宏定义和使用

    在iOS开发中,内存管理是至关重要的,而ARC(Automatic Reference Counting)和非ARC是两种不同的内存管理机制。ARC是Apple引入的一种自动引用计数技术,极大地简化了内存管理,而非ARC则是传统的手动引用计数。这篇...

    页面切换教程 使用了ARC技术

    本教程将聚焦于如何在应用中实现优雅的页面切换,并且重点介绍在这一过程中使用了Automatic Reference Counting (ARC) 技术。ARC是Objective-C中的内存管理策略,它自动处理对象的引用计数,大大简化了内存管理。 ...

    ARC完全学习指南

    ARC(自动引用计数,Automatic Reference Counting)是iOS开发中用于管理内存的技术,主要用于替代开发者手动管理对象引用计数。在iOS5引入ARC之后,这一技术得到了广泛的应用。学习ARC对于希望提高iOS开发技能的...

    iOS 弹出式菜单 MGTileMenu.zip

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

    ios9 单例模式区分arc与非arc宏的使用

    在iOS 9中,无论是使用ARC(Automatic Reference Counting)还是非ARC,都可以实现单例,但实现方式有所不同。本篇将详细介绍如何在iOS 9环境下,根据项目是否使用ARC来创建和使用单例。 首先,我们了解什么是ARC和...

    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. + ...

    swift中文教程

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

    Learn cocos2d 2.pdf 高清最新原版(ARC)

    - **ARC机制**:Automatic Reference Counting(自动引用计数),是Objective-C的一种内存管理方式。在ARC机制下,编译器会自动插入retain和release调用来管理对象的生命周期,从而简化了开发者的内存管理工作,减少...

    iOS ARC 概念讲解

    iOS中的Automatic Reference Counting(ARC)是Objective-C内存管理的一种机制,它是在iOS 5和Mac OS X 10.7引入的。ARC的主要目的是自动处理对象的引用计数,从而减轻开发者的负担,减少内存泄漏和过度释放等问题。...

Global site tag (gtag.js) - Google Analytics