OC内存管理
1>基本原理
①为什么要进行内存管理
因为移动设备的内存容量是非常有限的,iPhone4的内存只有512MB,如果不对内存进行合理的管理,那么我们的机器内存很可能是不够用的。
②OC内存管理针对哪些范围
任何继承了NSObject的对象,对其他基本数据类型(int、char、float、double、struct、enum等)无效,就是说OC的内存只对OC对象有用。
2>引用计数器
①什么是引用计数器(4Byte)
OC的每个对象都会有一个引用计数器,是一个整数,表示“对象被引用的次数”,即现在有多少人在使用对象;而且每个对象内部都有4个字节的空间来存放引用计数器。
②引用计数器的作用
简单讲,引用计数器的作用就是,标识我们的对象是否应该被系统回收的一个标志,当且仅当一个对象的引用计数器为0,该对象才会被系统回收。具体的说,当使用alloc、new或者copy创建一个新对象时,新对象的引用计数器默认就是1;当一个对象的引用计数器值为0时,对象占用的内存就会被系统回收。换句话说,如果对象的计数器不为0,那么在整个程序运行过程,它占用的内存就不可能被回收,除非整个程序已经退出
③引用计数器的操作
retain:当给对象发送一条retain消息,或者说调用对象的retain方法,那么对象的引用计数器+1;
release:当给对象发送一条release消息,或者说调用对象的release方法,那么对象的引用计数器-1;
retainCount:当给对象发送一条retainCount消息或者说调用对象的retainCount方法,将返回引用计数器的值。
④对象的销毁
销毁条件:当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统回收。
对象遗言:当对象在被销毁的时候,回想系统发出一个dealloc消息,或者说对象会调用dealloc方法,这个dealloc这就是对象的遗言。
dealloc(遗言)重写:通常我们会重写对象的dealloc方法;但是重写dealloc方法必须调用[super dealloc]调用父类的dealloc方法,而且必须写在最后面。
注意:dealloc方法是不能直接调用的,因为一旦对象被回收了,它占用的内存就不再可用,坚持使用会导致野指针错误。
⑤野指针
指向僵尸对象(不可用内存)的指针;
野指针错误标识:EXC_BAD_ACCESS访问了一块坏内存(被回收,不可用的内存);
空指针:没有指向任何对象的指针;
[nil release]是合法的
僵尸对象检测开关:EnableZombiem Objects
默认情况下,Xcode是不会管僵尸对象的,使用一块被释放的内存也不会报错。为了方便调试,应该开启僵尸对象监控
2>小零碎
①retain返回对象本身。
②[nil release]合法,OC没有空指针错误。
③dealloc方法通常会被重写,最后一句是[super dealloc]。
④EXC_BAD_ACCESS出现这个错误肯定是内存出错
⑤僵尸对象检测开关:EnableZombiem Objects
---------------------- ASP.Net+Unity开发、 .Net培训、期待与您交流! ----------------------详细请查看: www.itheima.com