ARC介绍

从Ray Wenderlich的教程中截取了一小段作为对objective c中ARC的介绍,讲得比较清晰,原文有丰富的例子,见此

它是怎么工作的

你大概已经熟悉如何手工管理内存了, 就像这样:
如果你想保持一个对象可用,除非它已经被 retain 了,否则你就需要 retain 它。
如果你不再需要一个对象了, 那么你就需要 release 它, 除非它已经被 release 了 (通过 autorelease)。

有一个重要的一点需要知道的,就是 ARC 是 Objective-C 编译器的一个特性, 所有 ARC 相关的处理都会发生在你构建你的应用的时候。 ARC 不是运行时特性(除了其中的一点, weak 指针系统)。 它也不是你在其他编程语言中所了解的垃圾回收机制。

指针保持对象存在可用

你需要了解的 ARC 的新规则很简单。 在手工内存管理中, 你需要 retain 一个对象,来让他可用。 这不再需要了, 你所需要做的仅仅是让一个指针指向那个对象。 只要有变量指针指向那个对象, 那么它就会一直在内存中。
当这个指针指向了另外一个对象,或者不再存在的时候, 和它相关联的那个对象会被释放掉。 这对所有类型的变量都适用: 实例变量, 属性, 甚至局部变量。
用所有者的方式来想它,就更好理解了。 当你这样做时,

NSString *firstName = self.textField.text;

firstName 变量成为一个指向 NSString 对象的指针, 它指向了文本框中的内容。 firstName 变量现在就是这个字符串对象的所有者。

一个对象可以有多个所有者。 直到用户改变了 UITextField 中的内容之前, 它的 text 属性也是这个字符串对象的所有者。 有两个指针指向了同一个对象:

稍后,用户会在文本框中输入一些新的文字, 这时它的 text 属性指向了一个新的字符串对象。 但是最初的那个字符串对象还是有一个所有者(firstName 变量), 所以它仍然在内存中。

只有当 firstName 也得到一个新的值的时候,或者它超出了作用范围 — 因为它是一个局部变量并且方法到了结尾,或者它是一个实例变量并且拥有它的对象被释放了 — 这时所有关系就失效了。 这个字符串对象不再有任何所有者, 它的 retain count 减少到 0,这个对象被释放了。

我们称 firstName 和 textField.text 为 “strong” 类型的指针, 因为他们能保持对象的存活。 默认情况下,所有的实例变量和局部变量都是 strong 指针。
也还有一个 “weak” 指针。 weak 类型的变量也能指向一个对象,但是他们不能成为所有者:

__weak NSString *weakName = self.textField.text;

weakName 变量和 textField.text 属性指向了同一个字符串对象, 但它不是所有者。 如果文本框的内容改变了, 这个字符串对象就不再有任何所有者了,然后就被释放了:
descr
这个时候, weakName 变量的值会自动变成 nil。 它也被叫做 “zeroing” weak 指针。
这个特性非常方便,因为它防止了指针指向了被释放的内存。 这种情况会导致很多 bug — 你可能听说过”悬空指针”或”僵尸”这样的术语 — 但多亏了 zeroing weak 指针, 这些不再是问题了!
你或许不会频繁的使用到 weak 指针。 他们大多在两个父子关系的对象上面比较有用。 父对象会有一个 strong 类型的指针指向子对象 — 因此它就”拥有”了子对象 — 但是为了防止所有关系循环, 子对象仅仅有一个 weak 指针指向父对象。
这样的一个例子是代理模式。 你的控制器拥有一个指向 UITableView 的 strong 指针。 Table View 的 datasource 和 delegate 反过来指向控制器,但用的是 weak 指针。 我们稍后会详细讨论这个。

下面这个非常有用:

__weak NSString *str = [[NSString alloc] initWithFormat:…];
NSLog(@”%@”, str);  // will output “(null)”

这个 string 对象没有任何所有者(因为 str 是 weak 的), 这个对象将会在创建后直接被释放掉。 Xcode 将会给你一个警告, 因为这或许不是你想要的结果 (“Warning: assigning retained object to weak variable; object will be released after assignment”)。
你可以用 __strong 关键字来表示一个变量是 strong 类型的指针:

__strong NSString *firstName = self.textField.text;

但是因为变量默认就是 strong 的,这样做是多余的。
属性可以是 strong 的,也可以是 weak 的。 属性的表示方法如下:

@property (nonatomic, strong) NSString *firstName;
@property (nonatomic, weak) id <MyDelegate> delegate;

ARC 很强大, 可以真正的去掉你代码中杂乱的部分。 你不再需要考虑什么时候 retain 还是 release, 只需要知道你的对象如何和其他对象关联起来。 你需要问一下你自己: 谁拥有什么?
例如,在以前不可能像这样写代码:

id obj = [array objectAtIndex:0];
[array removeObjectAtIndex:0];
NSLog(@”%@”, obj);

在手工内存管理机制下, 从数组中删除这个对象将会让 obj 变量的内容失效。 一旦这个对象从数组中被删除掉,它就会被释放。 通过 NSLog() 来打印这个对象会导致应用崩溃。 在 ARC 中,上面的代码会正常的工作。 因为我们把这个对象赋值给 obj 变量, 它是一个 strong 指针, 数组不再是这个对象唯一的所有者。 即使我们从数组中把这个对象删除掉, 这个对象仍然有效, 因为 obj 还在指向它。
Automatic Reference Counting 也还有一些不足。 作为刚刚起步的特性, ARC 仅仅适用于 Objective-C 对象。 如果你的应用用到了 Core Foundation 或者 malloc() 和 free(), 你还需要负责内存管理。 我们将会在这篇教程后面的部分看到一些例子。 另外, 为了让 ARC 正确的工作,一些语言规则会变得更严格。 仅有小小的牺牲, 你得到的会比你付出的更多!
正因为 ARC 帮你在适当的位置处理了 retain 和 release, 但这并不代表你可以完全忘记内存管理机制。 因为 strong 指针能够保持对象存活, 仍然存在一些情况,你需要手动的把这些指针设置为 nil, 不然你的应用将会耗尽可用内存。如果你一直保持所有你创建的对象都存活,那么 ARC 将不能释放他们。 因此, 当你创建一个新对象的时候, 你还需要考虑谁拥有它,还有这个对象应该存活多久。
毫无疑问,ARC 将会是 Objective-C 的未来。 苹果鼓励开发者放弃手工内存管理,从而开始用 ARC 来写他们的新应用。 它能带来更简单的源代码和更健壮的应用。
在 ARC 中, 内存相关的崩溃已经成为了过去。

时间: 2024-11-06 03:39:05

ARC介绍的相关文章

八.OC基础加强--1.autorelease的用法 2.ARC下内存管理 3.分类(category)4.block的学习

1.autorelease的用法   1.自动释放池及autorelease介绍 (1)在iOS程序运行过程中,会创建无数个池子,这些池子都是以栈结构(先进后出)存在的. (2)当一个对象调用autorelease时,会将这个对象放到位于栈顶的释放池中 . 2.为什么会有autorelease? OC的内存管理机制中比较重要的一条规律是:谁申请,谁释放. 但有些情况下,开发者并不能确定某些对象何时释放.这时候就需要自动释放池. 它的好处是: (1)不需要再关心对象释放的时间 : (2)不需要再关

object-c 的ARC 问答/介绍

原文:http://blog.csdn.net/kmyhy/article/details/8895606 概念" Clangstatic analyzer "是一个非常有用的查找代码中内存管理错误的工具.我在查看这个分析器的输出时经常会想,"既然你能找出错误,为什么就不能修正错误呢?" 实际上,这就是ARC的作用.编译器中包含了内存管理规则,但只能简单地由它自己来调用,无法帮助程序员查找错误. ARC介于自动垃圾回收(GC)和手动内存管理之间.就像垃圾回收,ARC

HDMI ARC功能详解及应用介绍

http://www.icpcw.com/Parts/Peripheral/Skill/3260/326044_2.htm [电脑报在线]很多用户和读者购买了电视以后,都发现自己电视的HDMI接口上经常标准了一些字眼,比如有的写着MHL,有的写着ARC--MHL我们都知道是手机专属的视频输出接口标准,那么ARC是什么? 智能电视HDMI ARC的应用方案 HDMI ARC的应用图示一:电视本地播放高清片源,可通过原有的HDMI线直接反向将数字音频输出到功放上解码 我们来列举一个典型的ARC应用案

基于Java的Arc Engine二次开发的环境的配置

1.软件准备 ArcGIS for Desktop 10.2, Arc engine, jdk-7u60-windows-i586,Eclipse Mar2 2.软件的安装 2.1 ArcGIS for Desktop 10.2的安装 软件的下载:ArcGIS for Desktop 10.3全套的下载:http://pan.baidu.com/s/1o7F4yue,附带破解方法 本文使用的是10.2,其下载路径与安装破解方法如:http://jingyan.baidu.com/article/

canvas简单的介绍

<canvas></canvas> 标签定义图形,比如图表和其他图像;它只是图形容器,您必须使用脚本来绘制图形. 所以使用canvas,主要是写很多javaScript来实现它的功能. 使用canvas,首先要定义canvas画布在body里面的范围: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5

podspec文件介绍

podspec文件是cocopods引入的第三方代码库的配置索引文件 它的创建命令是:$pod spec create TestFile podspec文件的常用配置字段介绍 Pod::Spec.new do|s| 框架名字:框架名字一定要写对,pod search "框架名"就是搜的这个 s.name         = "LeftAlignedCollectionView" 框架版本号 s.version      = "1.0.0" 框架简

Objective-C中类和对象的介绍

知识点 1.类的介绍 类是对象的类型,对象是类型的实例. 实例变量:用来区分同一类的不同对象,是描述对象用的.实例变量可以是各种类型:基本数据类型.指针.复合类型.其他类. 实例方法:用来操作一个类的对象的函数,实例方法是给外部的访问接口. 在OC中,使用#import包含头文件.防止头文件被重复包含. 2.类的声明 @interface className:parentClass<protocol,..> { //实例变量的声明 } method declarations //方法的声明 @

[转]基于C#的开源GIS项目介绍之SharpMap篇

我是一个刚毕业的GIS本科毕业生,目前在杭州从事GIS软件应用开发.在项目开发中总感觉自己的编程水平还不够,于是想找些开源GIS小项目来研究研究,借以提高自己的编程能力和项目开发能力.在网上搜了一下“GIS开源”发现还不少,下面是一个介绍GIS开源项目的链接: http://www.yuanma.org/data/2008/0526/article_3048.htm 里面介绍了基于各种编程语言的GIS开源项目,并列出了各自的特点和官网链接. 由于在学校时候学的一直都是C#和Visual Stud

iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角)

iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角) 2015-04-05 15:25 2482人阅读 评论(1) 收藏 举报开源框架 图像: 1.图片浏览控件MWPhotoBrowser       实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存.可对图片进行缩放等操作.      下载:https://github.com/mwaterfall/MWPhotoBrowser目前比较活跃的社区仍旧是Github,