本文主要谈谈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
(四)