文档章节

使用ARC时需要遵循的规则

lightUp
 lightUp
发布于 2015/06/17 17:55
字数 1052
阅读 15
收藏 0


如果想用ARC,必须服从一些新规则

1. 对象的Alloc/Init

创建对象的方法跟以前一样,但你一定不能调用retain/release/autorelease/retainCount。也不能通过selector偷偷地调用它们: 禁止使用@selector(retain)和@selector(release)。

2. dealloc方法

ARC为自动为你调用,一定不能直接调用dealloc。不过,如果你需要释放实例变量以外的资源,还是可以创建自定义的dealloc方法。但在这个方法里,不要调用[super dealloc]。因为ARC会帮你调。

3. 声明的属性

在ARC之前,我们是用@property指令中的assign/retain/copy参数来告诉编译器,如何管理这些属性的内存。用了ARC之后,这些参数就作废了,改用weak/strong这两个参数。

4. C结构中的对象指针

同样禁止使用。文档里建议不要把它们放在结构了,改放到类里去。否则ARC就不认识它们了。可能会出现一些移植上的问题。不过,ARC是可以以文件为单位来关闭的。参考下文的“引入不兼容ARC的代码”。

5. id与void*之间的临时互转

当我们在Core Foundation的C函数和Foundation Kit的Objective-C方法间传递对象时,常常需要进行id和void*两个类型的互转。叫做免费桥接(Toll Free Bridging)。

如果使用ARC,必须在CF对象进入和脱离ARC的控制时,用提示/限定符来告知编译器。限定符有__bridge、__bridge_retain和__bridge_transfer。另外,仍需要用CFRetain和CFRelease来管理Core Foundation的对象。

这一块已经比较高深了,如果你不清楚CF对象是什么,也不需要太烦恼。


6. 以@autoreleasepool代替NSAutoReleasePool

兼容ARC的代码不能再使用NSAutoReleasePool对象,而要改用@autoreleasepool{ }块。

7. 其它

基于Zone的内存已经没了(在运行时里也没了)。不能再使用NSAllocateObject和NSDeallocateObject。


ARC限定符 - 声明的属性

身为程序员,习惯于做出一些决定,例如把某个量声明为变量还是常量、本地还是全局,等等。因此,在这里,我们也要决定某个属性与其它属性的关系。我们用strong/weak来把这一关系告诉编译器。

强引用

强引用是对某对象的引用,并且能阻止它被回收。换句话说,强引用创建了一个所有关系。在ARC之前,我们这么写:

// Non-ARC Compliant Declaration
@property(retain) NSObject *obj;

在ARC下,我们需要这么写,以确保当前实例获得被引用对象的所有权(主人不被回收,它也不能被回收)。

// ARC Compliant Declaration
@property(strong) NSObject *obj;

弱引用

弱引用是对某对象的引用,但不能阻止它被回收。换句话说,弱引用并不会创建所有关系。在ARC之前,我们这么写:

// Non-ARC Compliant Declaration
@property(assign) NSObject *parentObj;

在ARC下,我们需要这么写,以确保当前实例没有获得被引用对象的所有权(一般来说,子对象不应该拥有父对象,这时可以用弱引用)。

// ARC Compliant Declaration
@property(weak) NSObject *parentObj;


ARC限定符 - 常规变量

上一节是说明如何管理属性。对于常规变量,则有:

__strong
__weak
__unsafe
_unretained
__autoreleasing

一般来说,我们不太需要使用上面这些限定符。在使用移植工具的时候可能会看到那么几个,但新工程基本上不需要。

__strong: 默认限定符,不需要显式指定。表示任何用alloc/init创建的对象在当前范围的生命期内得以保留。“当前范围”是指变量声明语句所在的两个大括号之间(方法、循环、块,等等)。

__weak: 表示对象可以随时被摧毁。只有当它被其它对象强引用时才有用。__weak变量在摧毁时,被设为nil。

__unsafe_unretained: 与__weak类似,但在摧毁时,不设为nil,保留原值(不再指向有效的东西)。

__autoreleasing: 不要与autorelease搞混,它用于通过引用传递对象,比如,通过引用传递NSError对象: [myObject performOperationWithError: ]。


本文转载自:http://www.oschina.net/translate/objc-automatic-reference-counting-in-xcode-explained

共有 人打赏支持
lightUp
粉丝 10
博文 242
码字总数 287936
作品 0
杭州
程序员
私信 提问
《Objective-C高级编程》内存管理

图片来自网络.jpg 前言 ARC是iOS 5推出的新功能,全称叫 ARC(Automatic Reference Counting)。简单地说,就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数...

_誌念
2017/12/26
0
0
Objective-C高级编程之内存管理篇

iOS的内存管理是采用引用计数的方式,引用计数分为手动引用计数和自动引用计数(ARC)。前者要求开发者手动管理内存,自己负责内存的申请与释放,后者是苹果推出的自动管理内存的方式,但其实...

还是不够辣
2017/02/24
0
0
Objective-C高级编程之引用计数,看我就够了

自动引用计数.png 1.1 什么是自动引用计数 概念:在 LLVM 编译器中设置 ARC(Automaitc Reference Counting) 为有效状态,就无需再次键入 或 代码。 1.2 内存管理 / 引用计数 1.2.1 概要 引用...

shenglanya
2017/12/19
0
0
iPhone开发之深入浅出 (1) — ARC是什么

ARC是什么 ARC是iOS 5推出的新功能,全称叫 ARC(Automatic Reference Counting)。简单地说,就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自...

小小贝
2012/12/18
0
0
Objective-C自动引用计数ARC

写在前面 这篇文章是阅读 Transitioning to ARC Release Notes 的笔记。 主要内容是关于 ARC 的规则。 简介 Automatic Reference Counting(ARC) 作为一个编译工具,自动管理 Objective-C 对象...

JiandanDream
05/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

纹理与表面细节添加方法---凹凸映射

中国龙-扬科
32分钟前
3
0
20181115上课截图

小丑鱼00
39分钟前
2
0
初识css自定义属性

这算是一篇两篇文章译文的糅合体,旨在帮助理解css自定义属性。 今天,CSS预处理器是Web开发的标准。 预处理器的一个主要优点是它们使您能够使用变量, 这有助于您避免复制和粘贴代码,并简化...

嫣然丫丫丫
49分钟前
2
0
JAVA基础--session共享的前生今世

session共享的前生今世 Session及cookie基本概念及生命周期 session   当浏览器发起一个新的HTTP请求时,WEB服务端会主动创建一个session.并分配一个sessionID作为服务端识别客户端的一个标...

spinachgit
57分钟前
1
0
Deepin Linux 下把 UC 缓存视频变为 MP4 文件

本文是利用 FFMPEG 的功能实现的。 生成 file.txt文件 因为缓存文件都是数字,且文件夹内还有其他文件,包括 index.* 的文件。 $ ls -1v --hide=file.txt --hide=index* > file.txt 解释 ls...

不避风云
58分钟前
1
3

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部