首页 > 代码库 > OC 内存管理
OC 内存管理
一、什么是内存管理
由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等。管理范围:任何继承NSObject的对象,对其他的基本数据类型无效。
二、操作
判断对象要不要回收的唯一依据就是计数器是否为0,若不为0则存在。所以对内存的管理就是对计数器的管理
1> retain : 计数器 +1, 会返回对象本身
2> release : 计数器 -1 ,没有返回值
3> retainCount : 获取当前的计数器
4> dealloc
* 当一个对象要被回收的时候,就会调用* 一定要调用 [super dealloc], 这句调用要放在最后面
三、 对象的销毁
当一个对象的引用计数器为0时,那么它将被销毁,其占用的内存被系统回收。
当对象被销毁时,系统会自动向对象发送一条dealloc消息,一般会重写dealloc方法,在这里释放相关的资源,dealloc就像是对象的“临终遗言”。一旦重写了dealloc方法就必须调用[super dealloc],并且放在代码块的最后调用(不能直接调用dealloc方法)。
一旦对象被回收了,那么他所占据的存储空间就不再可用,坚持使用会导致程序崩溃(野指针错误)。
四、 什么是野指针、僵尸对象
1> 僵尸对象: 所占用内存已经被回收的对象, 僵尸对象不能再使用 (EXC_BAD_ACCESS)
2> 野指针: 指向僵尸对象(不可用内存) 的指针。给野指针发送消息会报错
3> 空指针: 没有指向任何东西的指针(存储的东西是 nil、null、0),给空指针发送消息不回报错。
五、内存管理代码规范:
1.只要调用了alloc, 就必须 release (autorelease)
2.set 方法的代码规范
1> 基本数据类型: 直接复制<pre name="code" class="objc">- (void)setAge:(int)age { _age = age; }2> OC对象类型<pre name="code" class="objc">- (void)setCar:(Car *)car { // 1.先判断是不是新传进来的对象 if(car != _car) { // 2.对旧对象做一次release [_car release]; // 3.对新对象做一次 retain _car = [car retain]; } }3.dealloc 的代码
1> 一定要 [super dealloc], 而且放到最后面2> 对 self (当前)所拥有的其他对象 做一次 release<pre name="code" class="objc">- (void)dealloc { [_car release]; [super dealloc]; }
OC 内存管理
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。