ARC 学习总结

1、ARC基本认识

ARC全称叫 ARC(Automatic ReferenceCounting)机能在 iOS 5/ Mac OS X 10.7 开始利用 Xcode4.2 可以使用机能。

简单地理解ARC就是通指定的让编译(LLVM 3.0)编译码时生成例的引用数管理部分代有一点ARC并不是GC它只是一种代分析Static Analyzer工具

1)使用ARC的好

o   看到上面的例子大家就知道了以后写Objective-C的代码变简单多了不需要担心人的内存管理担心内存泄露了

o   少了看上去清爽了不少省了劳动

o   高速化由于使用编译器管理引用减少了低效代的可能性

2)不好的地方

o  住一堆新的ARC规则字及特性等需要一定的学周期

o  一些旧的代第三方代使用的候比修改代需要工数要么修改编译开关

关于第二点,由于XCode4.2 中缺省ARC就是 ON 的状态,所以编译旧代码的时候往往有"Automatic Reference Counting Issue"的错误信息。可以将编译设置中的Objectice-C Auto ReferenceCounteting设为NO

如果只想某个.m文件不适ARC可以只针对该类文件加上-fno-objc-arc编译FLAGS。(与其对应的是-fobjc-arc

3) ARC基本规则

o  retain,release, autorelease, dealloc编译器自插入不能在代

o  dealloc虽然可以被重但是不能[super dealloc]

o   不能使用NSAllocateObject, NSDeallocateObject

o   不能在C体中使用象指

o   idvoid*的如果cast需要用特定的方法__bridge

不能使用NSAutoReleasePool而需要@autoreleasepool

不能使用“new”开始的属性名称如果使用会有下面的编译错误Property’s synthesized getter followsCocoa naming convention for returning ‘owned’ objects” 

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

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

5)理的基本规则

o  只要象的持有者存在象被强参照),那么就可以使用该对

o  象失去了持有者后即被破弃

6)引用关

_strong

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

_weak

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

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

_unsafe_unretained

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

_autoreleasing

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

 

2、ARC@property的使用规则影响

1)所有者属性

我们先来看看与所有权有关系的属性,关键字间的对应关系。

属性

所有权
strong
_strong
weak
_weak
unsafe_unretained
_unsafe_unretained
copy
_strong
assign
_unsafe_unretained
retain
_strong

strong

该属性值对应 __strong 关键字,即该属性所声明的变量将成为对象的持有者。

weak

该属性对应 _weak 关键字,与_weak 定义的变量一致,该属性所声明的变量将没有对象的所有权,并且当对象被破弃之后,对象将被自动赋值nil。

并且,delegate 和 Outlet 应该用 weak 属性来声明。同时,如上一回介绍的 iOS 5 之前的版本是没有 _weak 关键字的,所以 weak 属性是不能使用的。这种情况我们使用 unsafe_unretained。

unsafe_unretained

等效于_unsafe_unretaind关键字声明的变量;像上面说明的,iOS 5之前的系统用该属性代替 weak 来使用。

copy

与 strong 的区别是声明变量是拷贝对象的持有者。

assign

一般Scalar Varible用该属性声明,比如,int, BOOL。

retain

该属性与 strong 一致;只是可读性更强一些。

2)读写相关的属性 (readwrite, readonly)
读写相关的属性有 readwrite 和readonly 两种,如果使用ARC之后,我么需要注意一下readonly 属性的使用。

比如下面的变量声明:

@property (nonatomic, readonly) NSString *name;

一般声明为 readonly 的变量按理说应该不需要持有所有权了,但是在ARC有效的情况下,将出现下面的错误信息 :

“ARC forbids synthesizing a property of anObjective-C object with unspecified ownership or storage attribute”


如果定义了ARC有效,那么必须要有所有者属性的定义;所以我们的代码改成这样,就OK了:

@property (nonatomic, strong, readonly) NSString *name; 

不过有一点,Scalar Varible的变量缺省都有 assign 的属性定义,所以不需要给他们单独的明示声明了。

3、Objective-C内存管理

Objective-C中内存管理的方式其就是指 引用 Reference Counting的使用准则:对象生成的候必定被某个持有者拿着如果有多个持有者的其引用数就会相反失去一个持有者那么引用数即会直到失去所有的持有者才真正地从内放自己

1)内存管理的依循的基本原

o  自己生成的那么既是其持有者

o  不是自己生成的也可成其持有者一个象可以被多个人持有

o  如果不想持有象的须释放其所有权

o  不能放已不再持有所有权的

结合 Objective-C 语言中的方法,我们来看看基本的内存管理。

方法

alloc/new/copy/mutableCopy
生成象并有所有权
retain
象所有权
release
象所有权
dealloc

Objective-C言内部格遵守上面表格中的定首先是alloc/new/copy/mutableCopy 这几个函数,并且是alloc/new/copy/mutableCopy 开头的函数,比如:allpcMyObject/newTheObject/copyThis/mutableCopyTheObject等都必须遵循这个原则。

如果不是 alloc/new/copy/mutableCopy的函数而且要返回象的那么用端只是生成而不是其持有者



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值