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];
}