ARC使用心得(一)

原创 2013年11月20日 20:11:45

ARC使用心得(一)
作者:wangzz
转载请注明出处
如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号wangzzstrive来支持我,谢谢!

写在前面:

很久没有更新日志了,最近的一个月经历了一段炼狱般的开发周期,那动不动加班到凌晨几点的日子,说多了都是泪。。。

项目组在三周时间内完成了两个月的工作量,疯狂的赶工期,使得开发过程中没时间研究某个功能使用哪种方式更好,只求能实现,因此也没学到什么新东西,唯一的收获就是学会了ARC的基本使用。

可能是用惯了手动内存管理,而且基本上不会有内存泄露的的情况发生,当项目组领导说在新项目中要使用ARC的时候,还有一定的抵触情绪。被赶鸭子上架般的强制要求使用了以后,慢慢被它的优点吸引,ARC确实大大减少了我们开发过程中在内存方面花费的时间。ARC的使用心得如下:

一、ARC使用环境

当前ARC是和IOS5一块发布的,很多人就以为只有IOS5以后才可以使用,事实上ARC 是 LLVM 3.0 编译器的新特性。从OS X v10.6和v10.7上的64位应用,以及IOS4和IOS5开始,Xcode4.2版本开始,都可以使用。

二、ARC实现原理

1、会降低应用的性能吗?

当初抵制使用ARC的另一个原因,竟然是以为它会降低应用的性能,我把它和OS X和Java中的垃圾回收机制混为一谈了,现在想想真是可笑。好吧这个问题的答案是,使用ARC几乎不会降低性能,甚至还有可能提示性能

官网上给的解释是:

It depends on what you’re measuring, but generally “no.” The compiler efficiently eliminates many extraneous retain/release calls and much effort has been invested in speeding up the Objective-C runtime in general. In particular, the common “return a retain/autoreleased object” pattern is much faster and does not actually put the object into the autorelease pool, when the caller of the method is ARC code.

ARC主要可能从两个方面使性能提升:

①编译器会减少很多外来的retain/release调用,这在运行时会有助提升性能

②不需要将返回的autoreleased类型的对象加入到autorelease pool中,也能在一定程度上提升性能

事实上,上述两条都是ARC在内存管理时优化性能的举措,它的实现机制会不会导致性能降低呢?

2、ARC实现原理

ARC的英文全名是:Automatic Reference Counting,编译器提供的管理Objective-C对象内存的一个机制。它并不是像垃圾回收机制那样,有一个负责内存回收的系统,而是仍然以引用计数为基础,只是开发者可以像使用垃圾回收机制那样,不用再(或者说只需要做少量的工作)为对象什么时候需要增加引用计数,什么时候需要减少引用引用计数而绞尽脑汁,编译器会为我们做好一切:在编译阶段,编译器会在需要retain或release对象的地方自动为我们加上对应的代码。官方文档提供的图片很形象:

总之,ARC的出现,让我们可以将精力集中在功能代码上。

三、ARC内存管理

1、内存管理规则

只有很简单的一句话:一个Object-C对象存在strong类型的指针指向时,该对象就不会被释放。

2、ARC中的属性关键字

属性、关键字和对应的所有权关系如下:


其中,属性值一列都是用于声明@property属性声明时用的,编译器编译后会将这些属性值转换成对应的关键字;关键字是用于声明属性列表或普通实例变量指针的

①strong
该属性值对应 __strong 关键字,即该属性所声明的指针变量将成为对象的持有者。strong是指向Objective-C对象指针的默认属性。
②weak
该属性对应__weak关键字,与__weak定义的变量一致,该属性所声明的变量将没有对象的所有权,并且当对象被破弃之后,对象将被自动赋值nil。
③unsafe_unretained
等效于__unsafe_unretaind关键字声明的变量;像上面说明的,iOS 5之前的系统用该属性代替 weak 来使用。
④copy
也是对象的所有者,与strong的区别是声明的指针变量是拷贝对象的持有者。
⑤assign
一般数值型变量用该属性声明,比如,int, BOOL,但无需显示写出,因为数值型变量的默认属性类型就是assign
⑥retain
该属性与strong功能相同。


上述的6个属性都可以在ARC中使用,但是assign和retain毕竟是MRC中的东西,而且assign和weak相比还是有不足之处的(下文会介绍),所以ARC中只推荐使用strong、weak、copy三个属性。

3、使用关键字声明指向Objective-C对象指针的规范书写方式

①只有一个内存管理关键字时

规范的写法如下所示:

//规范的写法
MyClass * __weak myWeakReference;
不规范的写法是:
//不规范的写法
__weak MyClass * myWeakReference;
大家尽量按照第一种苹果推荐的规范写法编程。

②还有其它关键字时

规范写法:

__block NSString * __weak myString

4、weak和assign的异同

相同点:

指向的对象都是随时有可能被释放,即不拥有指向的对象

不同点:

①weak只能用来声明Objective-C对象,assign既可以用来声明对象,也可以用来声明数值型变量;

②很关键的一点区别,当一个weak关键字声明的指针指向的对象被释放掉得时候,该指针会自动的被指向nil,这就大大降低了程序崩溃的可能性!!!而assign不存在该特性

5、变量的默认属性

使用@property声明或作为普通实例变量声明的指向Objective-C对象的指针属性默认都是strong;而使用@property声明的数值型变量属性默认的是assign,普通的数值型变量的属性是__unsafe_unretaind。


**************************************未完待续**************************************

ARC使用心得(二)

四、使用ARC需要注意的问题 1、ARC中读写相关的属性 读写相关的属性有 readwrite 和 readonly 两种,如果使用ARC之后,我么需要注意一下 readonly 属性的使用。 比...
  • wzzvictory_tjsd
  • wzzvictory_tjsd
  • 2013年11月21日 18:25
  • 5754

ARC使用心得

ARC使用心得 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/16844689 转载请注明出处 ...
  • hzhenx1989
  • hzhenx1989
  • 2014年02月11日 13:13
  • 333

ARC和MRC混合使用

在一些项目中尤其是做迭代的项目经常会出现MRC的项目,但是我们习惯了ARC环境,反之也是一样。这是我们不必去修改代码去掉release之类的,要找如下方案去做就可以了。 项目 -> Build Pha...
  • liu1347508335
  • liu1347508335
  • 2016年01月12日 15:14
  • 2622

Git与Arc重用命令(不断更新)

Git命令小结 git branch [name] 创建本地分支 git checkout [name] 切换本地分支 git add -u 只把修改的文件添加到索引库 git fetch...
  • u014527619
  • u014527619
  • 2015年07月21日 09:15
  • 1704

phabricator实战使用

phabricator实战使用根据我们上一节我们队phabricator的认识和基本环境的搭建以后,我们在本讲中更全面的了解到这个工具的使用。note:在使用这个工具的时候,要求我们对vim有一个基本...
  • liangliang103377
  • liangliang103377
  • 2017年06月20日 14:06
  • 632

ios 类文件中 ARC与非ARC的设置

用-fno-objc-arc标记来禁用在ARC工程那些不支持ARC的文件的ARC 用-fobjc-arc标记启用非ARC工程中支持ARC的文件   这样就可以混合使用了...
  • sqc3375177
  • sqc3375177
  • 2013年06月24日 10:14
  • 7879

设置部分文件不适用ARC机制 - iOS开发

般都是开启arc功能,毕竟不需要自己手动去释放,是一件比较轻松的事情。 但是我们在引用第三方的时候,基本上都是带release与retain的方法,这个时候代码编译就通不过 可以...
  • shinian0009
  • shinian0009
  • 2015年11月19日 13:27
  • 704

iOS中ARC项目使用MRC文件或MRC项目使用ARC

//    方法就是在Build Phase里面的Compile Source里面找到需要特殊处理的文件,加上编译选项(Compiler Flags),具体针对上面两种情况有所区别。 //   ...
  • sevenquan
  • sevenquan
  • 2015年12月30日 16:01
  • 998

iOS ARC的使用注意事项

1 ARC是IOS5.0以后才支持,IOS7.0以后,强制使用ARC 2 ARC Automatic Refercences Counting 3 原理  依然使用引用计数器来管理内存,只是引用...
  • iOSbird
  • iOSbird
  • 2016年02月18日 10:24
  • 691

iOS ARC工程中加入非ARC文件的编译选项配置

iOS ARC工程中加入非ARC文件的编译选项配置前言:常言道好记性不如烂笔头,项目中加入了一个MRC的文件,需要对相应的文件,进行相应的配置。iOS ARC工程中加入了非ARC文件的编译选项设置 这...
  • IDOshi201109
  • IDOshi201109
  • 2017年06月13日 10:39
  • 482
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ARC使用心得(一)
举报原因:
原因补充:

(最多只允许输入30个字)