首页 > 代码库 > 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 内存管理