从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 中, 内存相关的崩溃已经成为了过去。

ARC介绍的更多相关文章

  1. CEC和ARC介绍

    众所周知,HDMI作为一个数字化视频音频的接收标准,是可以同时传输视频和音频的,当然随着HDMI版本的提升,它的功能也一直在增强.事实上 当HDMI升级到1.3时,人们就发现了HDMI多了一个CEC功 ...

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

    1.autorelease的用法   1.自动释放池及autorelease介绍 (1)在iOS程序运行过程中,会创建无数个池子,这些池子都是以栈结构(先进后出)存在的. (2)当一个对象调用auto ...

  3. 内存管理2(主讲MRR)

    内存管理2 我们讨论过properties 后,所有的内存管理系统都是通过控制所有对象的生命周期来减少内存的占用.iOS和OS X应用程序完成这些是通过对象拥有者来实现的,它保证了只要对象使用就会存在 ...

  4. Objective-C 基础教程第九章,内存管理

    目录 Object-C 基础教程第九章,内存管理 前言: 对象生命周期 引用计数 RetainCount1项目例子 对象所有权 访问方法中的保留和释放 自动释放 所有对象放入池中 自动释放池的销毁时间 ...

  5. object-c 的ARC 问答/介绍

    原文:http://blog.csdn.net/kmyhy/article/details/8895606 概念" Clangstatic analyzer "是一个非常有用的查找 ...

  6. 李洪强iOS经典面试题36-简单介绍 ARC 以及 ARC 实现的原理

    李洪强iOS经典面试题36-简单介绍 ARC 以及 ARC 实现的原理   问题 简单介绍 ARC 以及 ARC 实现的原理. 考查点 ARC 是苹果在 WWDC 2011 提出来的技术,因此很多新入 ...

  7. 李洪强iOS经典面试题32-简单介绍 ARC 以及 ARC 实现的原理

    李洪强iOS经典面试题32-简单介绍 ARC 以及 ARC 实现的原理 问题 简单介绍 ARC 以及 ARC 实现的原理. 考查点 ARC 是苹果在 WWDC 2011 提出来的技术,因此很多新入行的 ...

  8. 关于ARC的介绍和ARC与MRC混编解决

    1. ARC & MRC 混合开发 在项目开发中,遇到使用MRC开发的第三方库怎么办? 例如:ASI 1> 尝试使用Xcode的转换工具(失败率比较高) 2> 在编译选项中,为MR ...

  9. ARC初步介绍

    [转载自 http://onevcat.com/2012/06/arc-hand-by-hand/] 手把手教你ARC——iOS/Mac开发ARC入门和使用 Revolution of Objecti ...

随机推荐

  1. Namespace declaration statement has to be the very first statement or after any declare call in the script

    0x00缘起 代码部署在windows上,出现了一个bug,临时用记事本打开修改了一下,于是出现了500错误 0x01排错 查看log,提示如下 "Namespace declaration ...

  2. bzoj1103【POI2007】大都市meg

    1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1544  Solved: 776 [Submit][St ...

  3. C语言 · 简单计算器

    算法提高 简单计算器   时间限制:1.0s   内存限制:512.0MB      问题描述 编程模拟计算器的加.减.乘.除功能,根据用户输入的运算符,对两个数进行运算.(要求switch语句) 输 ...

  4. python MQTT 出现TypeError: payload must be a string, bytearray, int, float or None.

    原因, MQTT 发布信息,是不能发布 对象的,只能发布 字符串,整形,浮点型这样的 解决方法 self.__mqtt__.publish("computex/iot/5100/DataTr ...

  5. Lifetime-Based Memory Management for Distributed Data Processing Systems

    Lifetime-Based Memory Management for Distributed Data Processing Systems (Deca:Decompose and Analyze ...

  6. PHP判断字符串的包含

    PHP语言是一个功能强大的嵌入式HTML脚本语言,它的易用性让许多程序员选择使用.PHP判断字符串的包含,可以使用PHP的内置函数strstr,strpos,stristr直接进行判断.也可以通过ex ...

  7. r语言 function 指定多个返回值

    # Goals: To write functions # To write functions that send back multiple objects. # FIRST LEARN ABOU ...

  8. 关闭R语言载入包时候的警告

    options(warn =-1)

  9. oracle 中execute immediate

    简单来说 就是你一个存储过程当中 创建了一个表 table_a 然后要用insert into将其他的数据插入到这个table_a当中,但是因为你在创建过程的时候 table_a还不存在,过程就会显示 ...

  10. python gpio

    打算用python控制gpio,网上找的都是一些关于树莓派如何操作gpio的文档,只针对树莓派.所以就自己封装一下函数,方便以后使用.在linux上已经生成了和gpio相关的文件,只要对文件进行读取即 ...