关于OC 的内存管理有很多模糊的地方,下面我们一一说起
首先概念性问题
概念
为什么进行内存管理
由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等。
内存管理类型: OC 类型
基本类型和C语言的类型:如:
int,short,char,struct,enum,union等类型
OC类型:任何继承于NSObject对象都属于OC的类型。我们讲的内存管理实际上是对OC类型的内存管理,它对基本数据类型和C语言的类型并不管用。
原因: 因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于栈中,而对象存储于堆中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指针也被回收,此时对象已经没有指针指向,但依然存在于内存中,造成内存泄露。
对象的基本结构
每个OC对象都有自己的引用计数器,是一个整数表示对象被引用的次数,即现在有多少东西在使用这个对象。对象刚被创建时,默认计数器值为1,当计数器的值变为0时,则对象销毁。
在每个OC对象内部,都专门有4个字节的存储空间来存储引用计数器。
管理方法
Objective-C的内存管理主要有三种方式ARC(自动内存计数)、手动内存计数、内存池.
引用计数器的作用
判断对象要不要回收的唯一依据就是计数器是否为0,若不为0则存在。
对象的销毁
当一个对象的引用计数器为0时,那么它将被销毁,其占用的内存被系统回收。
当对象被销毁时,系统会自动向对象发送一条dealloc消息,一般会重写dealloc方法,在这里释放相关的资源,dealloc就像是对象的“临终遗言”。一旦重写了dealloc方法就必须调用[super dealloc],并且放在代码块的最后调用(不能直接调用dealloc方法)。
一旦对象被回收了,那么他所占据的存储空间就不再可用,坚持使用会导致程序崩溃(野指针错误)。
内存管理原则
OC使用了一种叫做引用计数的机制来管理对象,如果对一个对象使用了alloc、[Mutable]copy,retain,那么你必须使用相应的realease或者autorelease。
也可以理解为自己生成的对象,自己持有。
非自己生成的对象,自己也能持有。
不在需要自己持有的对象时释放。
非自己持有的对象自己无法释放。
生成并持有对象,持有对象,释放对象,废弃对象。
MRC 手动内存计数
(Reference Counted)手动内存计数:就是说,从一段内存被申请之后,就存在一个变量用于保存这段内