iOS应用开发:什么是ARC?

深入浅出iPhone/iPad开发(第2版),中文高清完整扫描PDF版 《深入浅出iPhone/iPad开发(第2版)》是HeadFirst系列图书的一本最新力作。全书通过轻松的图文方式,由浅入深地向读者介绍SDK和Object-C的基础知识,以及如何构建并测试简单的应用模型,并提供如何利用iPhone/iPad的相机、GPS和重力感应器进行工作的方法和技巧,最终介绍了如何优化、测试并发布已开发的应用程序。   《深入浅出iPhone/iPad开发(第2版)》面向各层次的苹果产品开发人员,尤其适合初学的开发者阅读使用。 立即下载

http://mobile.51cto.com/iphone-313122.htm


ARC是什么

ARC基本规则

总结

新年伊始,万象更新。新一年开始,我们来更加深入了解一下iPhone开发的内部。作为开始,我们先来了解一下ARC。

ARC是什么

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

该机能在 iOS 5/ Mac OS X 10.7 开始导入,利用 Xcode4.2 可以使用该机能。简单地理解ARC,就是通过指定的语法,让编译器(LLVM 3.0)在编译代码时,自动生成实例的引用计数管理部分代码。有一点,ARC并不是GC,它只是一种代码静态分析(Static Analyzer)工具。

变化点

通过一小段代码,我们看看使用ARC前后的变化点。

 
  1. @interface NonARCObject : NSObject {  
  2.     NSString *name;  
  3. }  
  4. -(id)initWithName:(NSString *)name;  
  5. @end  
  6.  
  7. @implementation NonARCObject  
  8. -(id)initWithName:(NSString *)newName {  
  9.     self = [super init];  
  10.     if (self) {  
  11.         name = [newName retain];  
  12.     }  
  13.     return self;  
  14. }  
  15.  
  16. -(void)dealloc {  
  17.     [name release];  
  18.     [Super dealloc];  
  19. }  
  20. @end  
 
  1. @interface ARCObject : NSObject {  
  2.     NSString *name;  
  3. }  
  4. -(id)initWithName:(NSString *)name;  
  5. @end  
  6.  
  7. @implementation ARCObject  
  8. -(id)initWithName:(NSString *)newName {  
  9.     self = [super init];  
  10.     if (self) {  
  11.         name = newName;  
  12.     }  
  13.     return self;  
  14. }  
  15. @end  
我们之前使用Objective-C中内存管理规则时,往往采用下面的准则
  •    生成对象时,使用autorelease
  •    对象代入时,先autorelease后再retain
  •    对象在函数中返回时,使用return [[object retain] autorelease];

而使用ARC后,我们可以不需要这样做了,甚至连最基础的release都不需要了。

使用ARC的好处

使用ARC有什么好处呢?

  •    看到上面的例子,大家就知道了,以后写Objective-C的代码变得简单多了,因为我们不需要担心烦人的内存管理,担心内存泄露了
  •    代码的总量变少了,看上去清爽了不少,也节省了劳动力
  •    代码高速化,由于使用编译器管理引用计数,减少了低效代码的可能性

不好的地方

  •    记住一堆新的ARC规则 — 关键字及特性等需要一定的学习周期
  •    一些旧的代码,第三方代码使用的时候比较麻烦;修改代码需要工数,要么修改编译开关

关于第二点,由于 XCode4.2 中缺省ARC就是 ON 的状态,所以编译旧代码的时候往往有"Automatic Reference Counting Issue"的错误信息。

这个时候,可以将项目编译设置中的“Objectice-C Auto Reference Counteting”设为NO。如下所示。

如果只想对某个.m文件不适应ARC,可以只针对该类文件加上 -fno-objc-arc 编译FLAGS,如下图。

ARC基本规则

  •     retain, release, autorelease, dealloc由编译器自动插入,不能在代码中调用
  •     dealloc虽然可以被重载,但是不能调用[super dealloc]

由于ARC并不是GC,并需要一些规则让编译器支持代码插入,所以必须清楚清楚了这些规则后,才能写出健壮的代码。

Objective-C对象

ObjectiveC中的对象,有强参照(Strong reference)和弱参照(Weak reference)之分,当需要保持其他对象的时候,需要retain以确保对象引用计数加1。对象的持有者(owner)只要存在,那么该对象的强参照就一直存在。

对象处理的基本规则是
  •     只要对象的持有者存在(对象被强参照),那么就可以使用该对象
  •     对象失去了持有者后,即被破弃

强参照 (Strong reference)

(s1)

firstName作为”natsu”字符串对象的最初持有者,是该NSString类型对象的Strong reference。

(s2)

这里将firstName代入到aName中,即aName也成为了@”natsu”字符串对象的持有者,对于该对象,aName也是Strong reference。

(s3)

这里,改变firstName的内容。生成新的字符串对象”maki”。这时候firstName成为”maki”的持有者,而@”natsu”的持有者只有aName。每个字符串对象都有各自的持有者,所以它们都在内存中都存在。

(s4)

追加新的变量otherName, 它将成为@”maki”对象的另一个持有者。即NSString类型对象的Strong reference。

(s5)

将otherName代入到aName,这时,aName将成为@”maki”字符串对象的持有者。而对象@”natsu”已经没有持有者了,该对象将被破弃。

弱参照 (Weak reference)

接下来我们来看看弱参照 (Weak reference) 的使用方式。

(w1)

与强参照方式同样,firstName作为字符串对象@”natsu”的持有者存在。即是该NSString类型对象的Strong reference。

(w2)

使用关键字__weak,声明弱参照weakName变量,将firstName代入。这时weakName虽然参照@”natsu”,但仍是Weak reference。即weakName虽然能看到@”natsu”,但不是其持有者。

(w3)

firstName指向了新的对象@”maki”,成为其持有者,而对象@”natsu”因为没有了持有者,即被破弃。同时weakName变量将被自动代入nil。

引用关键字

ARC中关于对象的引用参照,主要有下面几关键字。使用strong, weak, autoreleasing限定的变量会被隐式初始化为nil。

  • __strong

变量声明缺省都带有__strong关键字,如果变量什么关键字都不写,那么缺省就是强参照。

  • __weak

上面已经看到了,这是弱参照的关键字。该概念是新特性,从 iOS 5/ Mac OS X 10.7 开始导入。由于该类型不影响对象的生命周期,所以如果对象之前就没有持有者,那么会出现刚创建就被破弃的问题,比如下面的代码。

 
  1. NSString __weak *string = [[NSString alloc] initWithFormat:@"First Name: %@", [self firstName]];  
  2. NSLog(@"string: %@", string); //此时 string为空  

如果编译设定OS版本 Deployment Target 设定为这比这低的版本,那么编译时将报错(The current deployment target does not support automated __weak references),这个时候,我们可以使用下面的__unsafe_unretained。

弱参照还有一个特征,即当参数对象失去所有者之后,变量会被自动付上nil (Zeroing)。

  • __unsafe_unretained

该关键字与__weak一样,也是弱参照,与__weak的区别只是是否执行nil赋值(Zeroing)。但是这样,需要注意变量所指的对象已经被破弃了,地址还还存在,但内存中对象已经没有了。如果还是访问该对象,将引起「BAD_ACCESS」错误。

  • __autoreleasing

该关键字使对像延迟释放。比如你想传一个未初始化的对像引用到一个方法当中,在此方法中实例化此对像,那么这种情况可以使用__autoreleasing。他被经常用于函数有值参数返回时的处理,比如下面的例子。

 
  1. - (void) generateErrorInVariable:(__autoreleasing NSError **)paramError {  
  2.     ....  
  3.     *paramError = [[NSError alloc] initWithDomain:@"MyApp" code:1 userInfo:errorDictionary];  
  4. }  
  5.  
  6. ....  
  7. {  
  8.     NSError *error = nil;  
  9.     [self generateErrorInVariable:&error];  
  10.     NSLog(@"Error = %@", error);  
  11. }  

又如函数的返回值是在函数中申请的,那么希望释放是在调用端时,往往有下面的代码。

 
  1. -(NSString *)stringTest  
  2. {  
  3.     NSString *retStr = [NSString stringWithString:@"test"];  
  4.  
  5.     return [[retStr retain] autorelease];  
  6. }  
  7.  
  8. // 使用ARC  
  9.  
  10. -(NSString *)stringTest  
  11. {  
  12.     __autoreleasing NSString *retStr = [NSString alloc] initWithString:@"test"];  
  13.  
  14.     return retStr;  
  15. }  

即当方法的参数是id*,且希望方法返回时对象被autoreleased,那么使用该关键字。

总结

今天,我们看到了基本的ARC使用规则
  •     代码中不能使用retain, release, retain, autorelease
  •     不重载dealloc(如果是释放对象内存以外的处理,是可以重载该函数的,但是不能调用[super dealloc])
  •     不能使用NSAllocateObject, NSDeallocateObject
  •     不能在C结构体中使用对象指针
  •     id与void *间的如果cast时需要用特定的方法(__bridge关键字)
  •     不能使用NSAutoReleasePool、而需要@autoreleasepool块
  •     不能使用“new”开始的属性名称 (如果使用会有下面的编译错误”Property’s synthesized getter follows Cocoa naming convention for returning ‘owned’ objects”)

原文地址:http://www.yifeiyang.net/development-of-the-iphone-simply-1/

ACR122读写软件,亲测可用,不需要注册,直接读写的,不是破解加密软件 立即下载

相关推荐

基于E310的纯逻辑代码实现AD9361射频收发

基于微相科技的E310平台实现AD9361的射频收发功能。采用纯逻辑控制的方式,不需要PS参与。实现了用VIO控制收发使能,发射功率,收发频率,数据接口时序控制,接收增益,BIST测试等功能。

xiaomingzi55的博客 2331

iPhone开发之 ARC是什么

相关链接:http://blog.youkuaiyun.com/diyagoanyhacker/article/details/7069889 http://www.yifeiyang.net/development-of-the-iphone-simply-1/ ARC是什么 ARC是iOS 5推出的新功能,全称叫 ARC(Automatic Reference Counti...

大为 392

AutoCAD2016安装破解教程

AutoCAD2016安装破解教程。本人亲自实验,破解成功,有效。以64位为例。 工具/原料   笔记本电脑 AutoCAD2016安装包 AutoCAD2016注册机(xf-adsk2016_x64.exe)链接:http://pan.baidu.com/s/1cAZQA windows7/8/8.1/10-32...

weixin_33804990的博客 1万+

关于iOS中ARC机制的理解

ARC是苹果公司在iOS4.3之后才出现的内存管理机制,全名为: ARC(Automatic Reference Counting)。简单地说,就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了。但其又有别于java,c#的自动垃圾回收机制。甚至在本人理解中,觉得ARC更优于JVM一些。        在ARC中又引入

黄晓智的博客 663

IAR安装成功的关键:STM32设备支持文件导入方法

IAR安装常卡在设备支持缺失这一步——尤其对STM32新手,没导入对应芯片包,编译直接报错。实测发现,必须通过IAR的Tools→Options→IDE→Configuration→Device Support手动加载STM32设备支持文件,否则新建工程时连芯片型号都选不到。IAR安装是否顺利,往往就差这一步。

weixin_42527589的博客 680

win11下的MySQL安装

目前官方最新版本是8.0.26,考虑到其稳定性、可靠性还需一定周期保证,所以使用官方版求稳定仍然建议5.7系列。3、选择MySQL Servers 5.7.38 -x64,然后按绿色箭头将选中的版本移植到右边选中框中。4、点击下方蓝色Advanced Options,选择安装位置。1、在开始界面搜索MySQL,点击command line。4、在“系统变量”中选择“path”,点击编辑。5、新建——>增加MySQL路径——>确定,12、execute,安装好后next。9、不需要做修改,直接点击next。.

rensweet的博客 2万+

HDMI传输设备上的ARC和EARC代表哪些功能?

各位小伙伴,看见“ARC”这几个字母,是不是有种熟悉的感觉。如果您家里有4K电视、智能高清电视、或者家庭影院、条形音箱,在这些设备的HDMI输入口上经常会看到有“ARC”或者“HDMI ARC”的标识。这些标识是什么意思呢? ARC ARC是指【音频回传通道】,在2009年HDMI论坛提出HDMI1.4版时所增加的附加功能。主要作用是传输声音信号,如果HDMI接口支持ARC,那么电视可以通过ARC将信号通过HDMI线传到功放或者其他有HDMI ARC功能的音频设...

hgynHangalaxy的博客 3万+

全覆盖路径规划开源项目Clean-robot-turtlebot3原理及流程概括总结

本系列文章主要介绍全覆盖路径规划开源项目Clean-robot-turtlebot3的相关内容,包含如下四篇文章,分别介绍了开源项目Clean-robot-turtlebot3流程的概括总结、ROS坐标系常用坐标及其变换、Clean-robot-turtlebot3关键函数解析等内容。

慕羽★的博客 6105

ArcGIS教程——ArcGIS快速入门

ArcGIS教程——ArcGIS快速入门

weixin_56135535的博客 6749

数据库系统概论第五版课后习题答案第十二章

对元组的插入、删除、修改;语义检查的具体做法是,DBMS读取数据字典,检查是否存在与该语句中的表、视图或索引等要创建的对象相同的对象名,检查该用户是否具有创建数据库对象的权限。答:操作系统提供的封锁机制和DBMS的封锁机制在封锁对象、封锁对象的状态、封锁的粒度、及封锁的类型上存在很大的差别,操作系统的封锁机制不能直接应用在DBMS中,DBMS必须重新设计,来满足复杂的封锁需求。数据库的建立和维护包括数据库的初始建立、数据的转换、数据库的转储和恢复、数据库的重组织和重构造以及性能监测分析等功能。

wenling54321的博客 694

AXI_Bus_Matrix_4x4 设计

Signal Source Width(bits) Description AWID Master AWID_WIDTH 写事务ID AWADDR Master

Starry__的博客 3768

ArcGis中这些你真的清楚么

对于,Gis我是外行。但是,外行人要想直接编程实现ArcGis中的功能,不搞清楚具体的含义,真心是没法编程。这两天,就被ArcGis中的一些概念性的东西给搞的一头雾水,费劲了精力查相关资料,最终功夫不负有心人,已经掌握了这些概念性的东西。NO1. Map在Map 对象上能显示的图形有两类一类是地理数据,一类是元素。1、地理数据包括矢量类型的要素数据,栅格数据,Tin 等表面数据等,这些数据都保存在G

流浪若相惜的专栏 3050

GEE:基于MODIS数据计算NDVI时间序列,并使用Savatsky-Golay(SG)滤波器对其进行平滑处理

优快云@_养乐多_本文将介绍如何在 Google Earth Engine (GEE) 平台中,使用 MODIS 数据计算 NDVI 时间序列,并对该数据集应用 Savitzky-Golay 滤波器,得到了一个新的平滑后的数据集。Savitzky-Golay 滤波器可以有效地去除信号中的噪声,并平滑信号的变化。该方法可以扩展到基于 MODIS 数据计算的任何指数或者波段。

养乐多的博客 1426

iOS应用开发:什么是ARC

http://mobile.51cto.com/iphone-313122.htm     ARC是iOS 5推出的新功能,全称叫 ARC(Automatic Reference Counting)。简单地说,就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了。 AD: 2013大数据全球技术峰会课程

any 616

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

上一篇: 在线查看android源代码的3种方式
下一篇: linux svn client - Rabbitvcs
Chuekup
博客等级 码龄15年 17粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值