oc对象的内存管理

时间:2022-10-02 06:50:38

oc没有java的垃圾回收机制,所以对象的内存释放很重要,基本数据类型,我们不用理会,编译器会处理;

oc的每个对象内部都由一个计数器,用来记录当前有几个指针在指向该对象;当计数器为0时该对象会从内存中释放;

相关方法和概念:

1:retain:对象方法,调用该对象方法,计数器+1,有返回值,返回对象本身;

2:release:没有返回值,计数器-1;

3;retainCount:获取当前计数器的值;

4:dealloc:当对象被回收时,就会调用该方法,覆盖该方法时一定要调用[super dealloc],且放在最后;释放的顺序一般是先释放子类再释放父类;

注:arc环境下不用调用[super dealloc]

概念:

1:僵尸对象:内存已经被回收的对象,僵尸对象是不能在使用的,

2:野指针:指向了僵尸对象(不可用内存)的指针;给野指针发消息会报错:EXE_BAD_ACCESS

3:空指针:没有指向任何对象的指针:值为0、nil、null;给空指针发消息不会报错;

多对象内存管理:

内存管理核心思想:一般来说,类方法:alloc是在堆中开辟空间的,调用了alloc,计数器会+1;所以一旦写了alloc,一定要写release;同样调用了retain,一定要调用release;

当对象较多时,对象之间的组合关系很容易让我们忽视掉了,这个对象的指向者有几个;所以规范严格的写好setter方法和dealloc方法;

内存管理代码规范总结:

1:只要调用了alloc,必须有release(autorelease)

2:setter的规范写法:

*:如果是基本数据类型,则和平常一样;

 *:如果成员变量是对象,也就是组合关系时,比如Person拥有一辆Car;那么Car的setter:

  

- (void)setCar:(Car *)car
{
// 首先判断传入的car是否和存在的car是同一个
if(_car != car)
{
// 先释放以前的car
[_car release];
// 在赋值 ,一定先对新的car做一次retain
_car = [car retain];
}
}

  3:dealloc方法的代码规范:

*:对self (当前) 拥有的其他对象执行一次release

*:一定要调用父类的dealloc [super dealloc],且要放到最后边;

- (void)dealloc
{
// 对当前对象的其他对象release
[_car release];
[super dealloc];
}