mlyixi's Blog

欲望的唤醒,信仰的坚定

ios内存管理总结 (非ARC)

一. 变量与属性

1. interface中定义的变量为指针,在实现文件中指向对象,若没有定义它的property,则无引用计数.(应该是这样的吧).

2. interface中定义的属性根据修饰符管理内存对象,其属性其实是变量的setter和getter,同时根据修饰符附加相应的release和retain方法.如retain(strong)修饰符会在setter中定义

- (void)setCount:(NSNumber *)newCount {    
    [newCount retain];
    [_count release];
    // Make the new assignment.
    _count = newCount;
}

而resign,weak则不会retain. copy会对复制的对象retain.

3. 变量与属性.如上所述,如果只要变量指向已有的对象,则不用指定其属性.而定义了属性,则必有变量,不论是显示的synthesize p=_p 或隐式的synthesize p.

其中_p为指定的变量名,而隐式的,则p同时为变量名. 这里要注意p和self.p的区别, p只是变量指针,而self.p其实是调用了setter,这就和修饰符有关了.

 

二.对象生命周期(alloc,init,retain,release,release)

1. 对于alloc/new/copy/mutablecopy产生的对象要负责release掉,因为这些方法会加引用计数.

2. 其它方法创建的对象,如类工厂方法(+), (id)以及带error的,产生的引用不需要主动释放,如果没有主动retain的话.

3. 函数返回值.如在函数中定义的变量需要返回给调用者,则使用autorelease方法.

 

三.IB中的对象

1. 苹果推荐一般使用weak,但是需要自定义的,如要隐藏的view,则只能使用retain.

2. 由于viewcontroller用kvo设置所有outlets是强引用的,所以如果一个控制器被解除了,top-views也将自动释放.

3. 这时有两种策略:要么retain所有outlets,然后在viewDidUnLoad,dealloc中释放解除之.要么把所有outlets都定义为弱.但显然,每二种在某些功能上不现实.