一、基本原理
(一)什么是内存管理
由于手机内存有限,一个app不应占用较大的空间,所以需要管理内存,回收不需要使用的内存空间。
管理范围:任何集成了NSObject的对象,对于其他基本数据类型无效。
本质:堆中存放对象,栈中存放局部变量。栈中数据会自动回收,堆中的对象则需要自己手动回收。
在之后的Xcode版本中存在ARC机制(Automatic Reference Counting)自动引用计数。
(二)对象的基本结构
每个OC对象都有自己的引用计数器,是一个整数,表示“对象被引用的次数”,此引用计数器占4个字节。
(三)引用计数器的作用
当使用alloc,new或者copy创建一个新对象时,新对象的引用计数器默认是1
当引用计数器值为0时,对象占用的内存就会被系统回收。
(四)引用计数器的操作
给对象发送一条retain消息,可以使引用计数器+1(retain方法返回对象本身)
给对象发送一条release消息,可以使引用计数器-1
给对象发送retainCount消息获得当前计数器值。
(五)对象的销毁
当对象被销毁时,系统会自动向对象发送一条dealloc消息,一般会重写dealloc方法释放相关的资源,
一旦重写了dealloc方法就必须调用[super dealloc],并且放在代码块的最后调用(不能直接调用dealloc方法)。
一旦对象被回收了,那么他所占据的存储空间就不再可用,坚持使用会导致程序崩溃(野指针错误)。
基本操作举例:
重写dealloc方法:
(六)僵尸对象:所占用内存已经被回收的对象,僵尸对象不能再使用。
当计数器为0时,对象已经被回收,此时如果再次执行[p release]即再次访问不存在的空间就会报错,错误如下:
表示访问了坏的内存。
所以当对象回收后,应该将野指针清空:p = nil; (注意:给p空指针发送release消息时,OC中不报错),如果发现
使用野指针发送消息时没有报错,那是因为没有勾选软件设置中的检测僵尸对象的选项,勾选上即可。
注意:不能使用[p retain]让对象起死回生。
二、内存管理原则
1、 原则分析
只要有人在用某个对象,这个对象就不会被回收。
只要想用这个对象,就让对象的计数器+1。
当不再使用此对象时,就让对象的计数器-1。
2、谁创建,谁release
如果通过alloc,new,[mutable]copy来创建一个对象,那么必须调用release,或autorelease。
3、谁retain,谁release
只要调用了retain,无论对象是如何生成的,都要调用release。
4、总结
曾经让对象的计数器+1,就必须让对象的计数器-1。