1、什么是内存管理
所以,我们需要对内存进行合理的分配内存、清除内存,回收那些不需要再使用的对象。从而保证程序的稳定性。
那么,那些对象才需要我们进行内存管理呢?
- 任何继承了NSObject的对象需要进行内存管理
- 而其他非对象类型(int、char、float、double、struct、enum等) 不需要进行内存管理
这是因为
- 继承了NSObject的对象的存储在操作系统的
堆
里边。 - 操作系统的
堆
:一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式类似于链表 - 非OC对象一般放在操作系统的
栈
里面 - 操作系统的
栈
:由操作系统自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈(先进后出)
2、 内存管理模型
提供给Objective-C程序员的基本内存管理模型有以下3种:
- 自动垃圾收集(iOS运行环境不支持)
- 手工引用计数和自动释放池(MRC)
- 自动引用计数(ARC)
3、如何进行内存管理
苹果是采用引用计数的原理进行内存管理的,当使用alloc、new或copy创建一个对象时,对象的引用计数为1;当对象调用retain时,引用计数会加1;当对象调用release或autorelease时,引用计数会减1;当对象的引用计数为0的时候,会调用dealloc方法,销毁对象。
4、 野指针和空指针
只要一个对象被释放了,我们就称这个对象为僵尸对象(不能被使用的对象);当一个指针指向一个僵尸对象(不可用的内存),则称这个指针为野指针,给野指针发送消息就会报错(EXC_BAD_ACCESS错误),为了避免野指针发送消息报错,对象释放时,会将对象设置为nil,向空指针发送消息没有任何反应5、 自动释放池
当我们不在使用一个对象时,需要将其内存释放,但是有时候我们不知道应该何时释放,为了解决这个问题,OC提供了autorelease的方法。
autorelease是一种支持自动引用计数的内存管理方式,只要给对象发送一条autorelease的消息,该对象就会被放入到自动释放池中,当自动释放池销毁的时候,会对池里的所有的对象做一次release的操作。(只有当引用计数为0的时候,对象才会被销毁)
autorelease方法会返回对象自身,调用完autorelease方法后,对象的引用计数不变。
好处:不用关心对象释放的时间
原理实质:把release的调用延迟了,对于每一个autorelease,系统只是把对象放入到了autorelease pool中,当pool释放的时候,pool中的所有对象都会调用release。
6、ARC 自动管理内存(Automatic Reference Counting)
自动引用计数,iOS5推出的,用来解决手动管理内存的麻烦。
使用ARC后,系统会自动检测何时需要保持对象,何时需要释放对象,编译器会管理好内存,会在合适的地方插入retain、release或autorelease,通过生成正确的代码去保持对象或释放对象。