iOS之一则形象说明,完美诠释内存管理机制

来源:互联网 发布:网络短信免费发送 编辑:程序博客网 时间:2024/06/08 09:23

   经历过MRC编程的同学,相信对iOS的内存管理机制都曾经头疼不已,MRC主要采用的引用计数的方式管理内存,学习MRC,最为关键的是如何理解引用计数器。


引用计数(Reference Count)

在引用计数中,每一个对象负责维护对象所有引用的计数值。当一个新的引用指向对象时,引用计数器就递增,当去掉一个引用时,引用计数就递减。当引用计数到零时,该对象就将释放占有的资源。


为了让初学者更好更形象地理解引用计数器,很多大神、老师为此花了不少时间和精力。记得当年学习千X教程时,老师举了一个多人遛狗的故事:当有人引用对象,相当于在狗圈栓上一根绳子,多人各自用绳子遛狗,当最后把绳子都拿掉,这狗没人看管了,内存就需要被释放掉。

     道理虽然浅显易懂,但总觉得比喻不恰当,生活中不可能多人用绳子遛同一条狗啊,哈哈。。。最近发现《Pro Multithreading and Memory Management for iOS and OS X》里面讲的例子更加恰当,更加贴近生活,故与大家分享一下:通过开关房间的灯为例来说明引用计数机制


图中,“需要照明的人数”即对应我们要说的引用计数值。

  1. 第一个人进入办公室,“需要照明的人数”加1,计数值从0变为1,因此需要开灯;
  2. 之后每当有人进入办公室,“需要照明的人数”就加1。如计数值从1变成2;
  3. 每当有人下班离开办公室,“需要照明的人数”加减1如计数值从2变成1;
  4. 最后一个人下班离开办公室时,“需要照明的人数”减1。计数值从1变成0,因此需要关灯。

在Objective-C中,”对象“相当于办公室的照明设备,”对象的使用环境“相当于进入办公室的人。上班进入办公室的人对办公室照明设备发出的动作,与Objective-C中的对应关系如下表

对照明设备所做的动作对Objective-C对象所做的动作开灯生成对象需要照明持有对象不需要照明释放对象关灯废弃对象

使用计数功能计算需要照明的人数,使办公室的照明得到了很好的管理。同样,使用引用计数功能,对象也就能得到很好的管理,这就是Objective-C内存管理,如下图所示


 





原创粉丝点击