【iOS7的一些总结】1、ARC自动引用计数

简介: 对于软件开发而言,引用计数Reference Counting不是一个陌生的概念。在组件对象模型COM中,这就是一个非常重要的概念。每一个对象都维持着一个量称为“引用计数”,标志着有多少“客户”程序在引用当前的对象。

对于软件开发而言,引用计数Reference Counting不是一个陌生的概念。在组件对象模型COM中,这就是一个非常重要的概念。每一个对象都维持着一个量称为“引用计数”,标志着有多少“客户”程序在引用当前的对象。只要还有“客户”引用当前对象,也就是引用计数非零,那么这个对象将会保存在内存中不会消失;如果没有任何“客户”引用当前对象了,那引用计数将被设为0,此时该对象将会从内存中释放。通过这种机制可以防止已经废弃的对象继续存在在内存中造成内存泄露,同时也可以防止释放一个本来已经不存在的对象而引起bug。


要形象地解释,可以把这个过程理解为“几个酒鬼去酒馆喝酒”。这几个酒鬼走进酒馆坐下,酒保给他们上了一大桶啤酒并没人发了一根吸管。这里就可以把啤酒桶当做是程序中的“对象”,酒鬼作为客户程序。当一个酒鬼把吸管插在酒桶上,那么这个“客户”就开始引用当前对象,其引用计数为1。当第二个酒鬼也把吸管插在酒桶上开始喝酒时,引用计数便成为2。此时如果第一个酒鬼停止喝酒并拔掉吸管,那么依然有一个人在用吸管喝酒,也就是引用计数由2变为1。同样,第三、第四个酒鬼可能也会开始用吸管喝酒,也可能暂时停止喝酒。在这种环境下,“引用计数”就可以认为是一个数量,说明了当前有几个酒鬼的吸管连在酒桶上;只要至少有一个人在用习惯喝酒,那么酒保就不会吧酒桶收走,只有酒桶中的就被喝光了,所有人都拔掉了吸管,此时酒桶的“引用计数”变为0,这时酒鬼们结账走人,酒保会收走酒桶,这意味着这个对象不会有客户程序引用,将会被从内存中释放掉。采取“引用计数”这种方法会给酒保省掉很多麻烦:试想,如果还有人在喝着呢,酒保就把酒桶收走了,那个酒鬼肯定会发酒疯把桌子掀了(O(∩_∩)O哈哈~);如果人都结账走人了,酒桶还在桌子上放着,这样就会降低酒吧的翻台率,影响利润。这就是引用计数在防止内存泄露和提高代码效率中的作用。


在iOS开发中,一样也存在这些问题,而且开发者一不留神就会遗忘。因此从iOS5开始,苹果提供了ARC这样的一个机制来处理这样的问题,可以在代码中自动对对象进行retain、release操作,减轻了开发者的负担。举一个简单的例子:

myClass *pObj = [[myClass alloc] init];
//.....
[self someMethod:pObj];
[pObj release];

有些时候,最末一行的release函数经常会被遗忘,因此采用了ARC之后的好处就体现出来了——ARC会自动监控pObj的引用计数,在合适的时候进行retain和release。对于更详细的内容,可以参考ios官方文档对于ARC的解释


使用ARC必须注意的一些问题:

1、不能显示地调用dealloc/retain/release/retainCount/autorelease;除了dealloc之外其他函数也不能进行重写;

2、不能再C结构体中使用指向一个objective-c对象的指针,而应该使用objective-c类;
3、由于属性property的getter函数不能以new开头,除非对属性的获取方法进行重写,否则属性的名称也不能以new开头。


ARC引入了新的属性限定词:

对象的属性默认为是strong类型,strong类型意味着实实在在的引用和控制,也就是一名“喝酒的酒鬼”。可以认为strong与retain代表相同的含义。而weak类型不同,weak类型的引用并不意味着对对象的生存周期产生控制,只要该对象的强引用不存在了,弱引用也将置为nil;也就是说,weak类型的引用者并不是酒鬼,而是在旁边看着这群酒鬼醉酒失态胡言乱语还看得津津有味的无聊人士(呵呵),只要有酒鬼在喝酒他就在旁边看,酒鬼走了他也就走了,酒保也不会因为他还在看这个空酒桶而继续把桶放在桌子上嘛。


使用strong/weak来防止循环引用:

有些时候,两个对象之间可能存在相互关系,如果两个关系都是强引用的话,那么这两个对象永远不会存在引用计数为0的时候,也就永远得不到释放。将其中一个设置为weak将很好地解决这个问题。

目录
相关文章
|
4月前
|
Swift iOS开发 开发者
IOS开发基础知识:什么是 ARC(自动引用计数)?如何工作?
IOS开发基础知识:什么是 ARC(自动引用计数)?如何工作?
50 1
|
iOS开发 编译器 C语言
|
iOS开发 Java 编译器