黑马程序员-----OC内存管理(一)

来源:互联网 发布:写小说的网站 知乎 编辑:程序博客网 时间:2024/05/17 02:44
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------

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
0 0
原创粉丝点击