OC_内存管理

177 阅读3分钟

基本原理

为什么要进行内存管理

由于移动设备的内存极其有限,所以每个 app 所占的内存也是有限制的,当 app 所 占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等。

管理范围

任何继承 NSObject 的对象,对其他的基本数据类型无效。

本质原因是因 为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于栈中,而对象存储于堆中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指针也被回收,此时对象已经没有指针指向,但依然存在于内存中,造成内存泄露。

对象的基本结构

每个 OC 对象都有自己的引用计数器,是一个整数表示对象被引用的次数,即现在有 多少东西在使用这个对象。对象刚被创建时,默认计数器值为 1 ,当计数器的值变为 0 时,则对象销毁。在每个 OC 对象内部,都专门有 4 个字节的存储空间来存储引用计数器。

引用计数器的作用

判断对象要不要回收的唯一依据就是计数器是否为 0,若不为 0 则存在。

操作

给对象发送消息,进行相应的计数器操作。

Retain 消息 : 使计数器 +1,该方法返回对象本身。

Release 消息 : 使计数器 -1 (并不代表释放对象)。

retainCount 消息 : 获得对象当前的引用计数器值。

对象的销毁

当一个对象的引用计数器为 0 时,那么它将被销毁,其占用的内存被系统回收。

当对象被销毁时,系统会自动向对象发送一条 dealloc 消息,一般会重写 dealloc 方法,在这里释放相关的资源,dealloc 就像是对象的“临终遗言”。

一旦重写了 dealloc 方法就必须调 用[super dealloc],并且放在代码块的最后调用(不能直接调用 dealloc 方法)。

一旦对象被回收了,那么他所占据的存储空间就不再可用,坚持使用会导致程序崩溃(野指针错误)。

相关概念和使用注意

野指针错误 : 访问了一块坏的内存(已经被回收的,不可用的内存)

僵尸对象 : 所占内存已经被回收的对象,僵尸对象不能再被使用(打开僵尸对象检测)

空指针 : 没有指向任何东西的指针(存储的东西是 0 , nullnil),给空指针发送消息不会报 错

注意 : 不能使用 [pretaion] 让僵尸对象起死复生。

内存管理原则

原则

  • 只要还有人在使用某个对象,那么这个对象就不会被回收。
  • 只要你想使用这个对象,那么就应该让这个对象的引用计数器 +1 。
  • 当你不想使用这个对象时,应该让对象的引用计数器 -1 。

谁创建,谁 release

如果你通过 alloc , new , copy 来创建了一个对象,那么你就必须调用 release 或者 autorelease 方法。

不是你创建的就不用你去负责。

谁 retain,谁 release

只要你调用了 retain,无论这个对象是如何生成的,你都要调用 release

总结

有始有终,有加就应该有减。曾经让某个对象计数器加 1 ,就应该让其在最后-1 。

文章转载自 www.imooc.com 侵删