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 中, 内存相关的崩溃已经成为了过去。
ARC介绍的更多相关文章
- CEC和ARC介绍
众所周知,HDMI作为一个数字化视频音频的接收标准,是可以同时传输视频和音频的,当然随着HDMI版本的提升,它的功能也一直在增强.事实上 当HDMI升级到1.3时,人们就发现了HDMI多了一个CEC功 ...
- 八.OC基础加强--1.autorelease的用法 2.ARC下内存管理 3.分类(category)4.block的学习
1.autorelease的用法 1.自动释放池及autorelease介绍 (1)在iOS程序运行过程中,会创建无数个池子,这些池子都是以栈结构(先进后出)存在的. (2)当一个对象调用auto ...
- 内存管理2(主讲MRR)
内存管理2 我们讨论过properties 后,所有的内存管理系统都是通过控制所有对象的生命周期来减少内存的占用.iOS和OS X应用程序完成这些是通过对象拥有者来实现的,它保证了只要对象使用就会存在 ...
- Objective-C 基础教程第九章,内存管理
目录 Object-C 基础教程第九章,内存管理 前言: 对象生命周期 引用计数 RetainCount1项目例子 对象所有权 访问方法中的保留和释放 自动释放 所有对象放入池中 自动释放池的销毁时间 ...
- object-c 的ARC 问答/介绍
原文:http://blog.csdn.net/kmyhy/article/details/8895606 概念" Clangstatic analyzer "是一个非常有用的查找 ...
- 李洪强iOS经典面试题36-简单介绍 ARC 以及 ARC 实现的原理
李洪强iOS经典面试题36-简单介绍 ARC 以及 ARC 实现的原理 问题 简单介绍 ARC 以及 ARC 实现的原理. 考查点 ARC 是苹果在 WWDC 2011 提出来的技术,因此很多新入 ...
- 李洪强iOS经典面试题32-简单介绍 ARC 以及 ARC 实现的原理
李洪强iOS经典面试题32-简单介绍 ARC 以及 ARC 实现的原理 问题 简单介绍 ARC 以及 ARC 实现的原理. 考查点 ARC 是苹果在 WWDC 2011 提出来的技术,因此很多新入行的 ...
- 关于ARC的介绍和ARC与MRC混编解决
1. ARC & MRC 混合开发 在项目开发中,遇到使用MRC开发的第三方库怎么办? 例如:ASI 1> 尝试使用Xcode的转换工具(失败率比较高) 2> 在编译选项中,为MR ...
- ARC初步介绍
[转载自 http://onevcat.com/2012/06/arc-hand-by-hand/] 手把手教你ARC——iOS/Mac开发ARC入门和使用 Revolution of Objecti ...
随机推荐
- 什么是POP3、SMTP和IMAP?
POP3 POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议.它是因特网电子邮件的第 ...
- 3. DNN神经网络的正则化
1. DNN神经网络的前向传播(FeedForward) 2. DNN神经网络的反向更新(BP) 3. DNN神经网络的正则化 1. 前言 和普通的机器学习算法一样,DNN也会遇到过拟合的问题,需要考 ...
- golang后台任务库
功能需求 本来想用linux自带的corntab,然而corn调试困难,而且不支持以下需求 能分布式 有http接口 能调试 有统计 kala 这个需求也不算小众,于是在网上查了一下,果然有,而且还比 ...
- java基础篇---网络编程(UDP程序设计)
UDP程序设计 在TCP的索引操作都必须建立可靠地连接,这样一来肯定会浪费大量的系统性能,为了减少这种开销,在网络中又提供了另外一种传输协议---UDP,不可靠的连接,这种协议在各个聊天工具中被广泛的 ...
- [转]bigdecimal 保留小数位
原文地址:https://www.cnblogs.com/liqforstudy/p/5652517.html public class test1_format { public static vo ...
- 【Unity】AssetBundle的使用——打包/解包
最近参考了各位大神的资源,初步学习了Unity的资源管理模式,包括在编辑器管理(使用AssetDatabase)和在运行时管理(使用Resources和AssetBundle).在此简单总结运行时用A ...
- Java并发编程 LockSupport源码分析
这个类比较简单,是一个静态类,不需要实例化直接使用,底层是通过java未开源的Unsafe直接调用底层操作系统来完成对线程的阻塞. package java.util.concurrent.locks ...
- Nginx优化(十七)
[教程主题]:Nginx优化 [课程录制]: 创E [主要内容] Nginx 优化 nginx介绍 Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”,是 ...
- 在springmvc中无法使用@value()注解
折腾了一下午,试了很多解决办法,就是死活不能扫描到properties文件.本来打算使用软编码的,尝试更改了全部jar包版本,还是无法解决. 后面想到了,spring和springmvc容器的加载顺序 ...
- HTML select 选中触发事件
$(function () { $("#cityidchange").change(function (data) { var cityid = $("#cityidch ...