之前做C#基本没有关心过内存释放,因为C#是有垃圾回收机制的。

写这篇文章的原因是类似MRC这种以后可能会很少用到,但是又比较重要,总结一些重点有便于加深记忆及回顾。


1. MRC

1-1. 什么是MRC?

MRC(Manual reference counting)是iOS5.0以前使用的内存管理机制,在该机制下,通过操作每个对象的引用计数器,达到控制对象内存的目的。 ##1-2. 引用计数器 简而言之,每个对象都持有一个引用计数器(以下简称为RC)。当创建了一个对象的实例时,该对象的RC就是1;当RC为0,该对象就会被回收。

注意事项: 野指针:指向已经被回收了的对象(也叫僵尸对象)的指针,一旦使用这种对象,会出现EXEC_BAD_ACCESS错误,在OC中是不会有空指针错误的。。 这种回收方式,虽然可以非常精确的控制对象的释放时机,但是非常不友好,于是就有了自动释放池

1-3. 自动释放池

自动释放池也是一个对象,当你把另一个对象“放入”池子后,在该池子释放时,会把池子中所有的对象都执行一次release方法

2. ARC

ARC(Automatic reference counting)是iOS5.0以后推荐使用的内存管理机制,在该机制下,没有强指针指向对象,就会释放对象,ARC的本质就是由编译器来自动生成操作引用计数器的代码

ARC时代的到来代表程序员基本不用看到满篇的retainrelease了,可以专注于解决实际问题而不用分心太多于内存管理上,同时也保证了一定的效率,当然这些是我的理解。

3. 引用计数算法的缺点——循环引用

当多个对象互相引用的时候,我们调用其release方法会发现引用计数器还是1,因为无法触发它的dealloc方法,然后内部的对象就无法释放,这就造成了循环引用,谁也释放不了。

解决方法: 其中一个对象的属性不使用retain\strong而使用assign\weak,也就是创建该对象时,该对象引用计数器是不增加的。 同时,声明assign\weak属性的对象在dealloc时也不需要为该属性调用release方法。