OC内存管理 一、基本原理 (一)为什么要进行内存管理。 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等。 管理范围:任何继承NSObject的对象,对其他的基本数据类型无效。 本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于栈中,而对象存储于堆中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指针也被回收,此时对象已经没有指针指向,但依然存在于内存中,造成内存泄露。
(二)对象的基本结构 每个OC对象都有自己的引用计数器,是一个整数表示对象被引用的次数,即现在有多少东西在使用这个对象。对象刚被创建时,默认计数器值为1,当计数器的值变为0时,则对象销毁。 在每个OC对象内部,都专门有4个字节的存储空间来存储引用计数器。
(三)引用计数器的作用 判断对象要不要回收的唯一依据就是计数器是否为0,若不为0则存在。
(四)操作 给对象发送消息,进行相应的计数器操作。 Retain消息:使计数器+1,改方法返回对象本身 Release消息:使计数器-1(并不代表释放对象) retainCount消息:获得对象当前的引用计数器值
(五) 对象的销毁 当一个对象的引用计数器为0时,那么它将被销毁,其占用的内存被系统回收。 当对象被销毁时,系统会自动向对象发送一条dealloc消息,一般会重写dealloc方法,在这里释放相关的资源,dealloc就像是对象的“临终遗言”。一旦重写了dealloc方法就必须调用[super dealloc],并且放在代码块的最后调用(不能直接调用dealloc方法)。 一旦对象被回收了,那么他所占据的存储空间就不再可用,坚持使用会导致程序崩溃(野指针错误)。
二、相关概念和使用注意 野指针错误:访问了一块坏的内存(已经被回收的,不可用的内存)。 僵尸对象:所占内存已经被回收的对象,僵尸对象不能再被使用。(打开僵尸对象检测) 空指针:没有指向任何东西的指针(存储的东西是0,null,nil),给空指针发送消息不会报错 注意:不能使用[p retaion]让僵尸对象起死复生。
|