谈谈ios内存管理--持续更新

  本文主要谈谈ios内存管理的发展脉络,不足之处,还请指教,相互学习交流。做ios开发,永远无法避开内存管理,无论我们是否有意识去考虑这个事情,但是只要我们写了OC程序,那么就与内存管理有关。

  一、内存管理是做什么的?

  二、内存管理方式一:MRC

   (一)引用计数器

   (二)原则

   (三)alloc、new、copy、mutableCopy、retain、release、dealloc

      alloc内部实现

      引用计数表

   (四)autorelease

  三、内存管理方式二:ARC

  (一)__strong

  (二)__weak 和__unsafe_unretained

  (三)__autoreleaseing

  (四)

 

一、内存管理是做什么的?

  内存管理,就是对内存进行管理。先看一个情况:我们用代码创建了一个对象A,对应会分配一块内存空间给它,使用完了对象A,就和系统说一声,系统接到通知,收回内存空间。理当如此。但是,当使用对象A的人不止一个,张三先用完了,李四还在用,张三此时通知系统,“我不用对象A了”,系统接到通知,收回内存空间,还在使用对象A的李四就不能用了(野指针),求李四心里阴影面积。。。为了解决这个问题,苹果官方引入“引用计数器”,引用计数器用来记录当前有多少“人”在使用某个对象,那么收回内存空间的判断标准就变成了——引用计数器的值是0。有一个人开始用对象,该对象的引用计数器就+1,不用了,就-1。这就解决了上述多人使用同一个对象时的内存管理问题。

  那么,内存管理的问题,就集中到了引用计数器的管理上来。

二、内存管理方式一:MRC    

 (一)手动内存管理的思考方式

    大家都知道,MRC是手动管理引用计数模式。在MRC下,OC的内存管理思方式:

    1、自己生成的对象,自己持有;

    2、非自己生成的对象,自己也能持有;

    3、自己不再使用的对象,释放;

    4、非自己持有的对象无法释放。(野指针,比如只有一个pool,但连续用了两次autorelease方法)

    解释一下:持有的意思是retain,让计数器+1,释放的意思是release,让计数器-1。

 (二)alloc、new、copy、mutableCopy、dealloc

    使用alloc、new、copy、mutableCopy得到的对象,不用的时候,要release。调用release方法的时候,内部会判断,如果计数器release之后,计数器为0时,调用对象的dealloc方法,废除(回收、释放)内存空间。

 (三)autorelease

   简单说,在autoreleasepool中调用对象A的autorelease方法,就是使用对象A,但不retain,引用计数器不+1,将对象A添加到自动释放池的一个数组array中,相当于注册登记了一下。等自动释放池drain的时候,会调用自动释放池的dealloc方法,delloc方法调用另一个方法,遍历取出数组array中的对象,并执行对象的release方法。

三、内存管理方式二:ARC

  后来,苹果官方引入了ARC模式,大家解放了很多,因为不用再写retain、release等代码来管理内存了。只要用对应的修饰符来修饰指向对象内存空间的指针,系统就会自动为我们管理内存。

 (一)__strong

 (二)__weak 和__unsafe_unretained

 (三)__autoreleaseing

  (四)

 

posted on 2015-11-06 23:31  磐玉  阅读(171)  评论(0编辑  收藏  举报

导航