写高质量OC代码52建议总结:29.理解引用计数

oc使用引用计数来管理内存,可加减。想让某个对象继续存活,就增加其引用计数,用完了就递减。引用计数为0时,表示没人继续使用该对象,就可以销毁了。
 “垃圾回收机制”在MAC OS X 10.8之后废弃,在IOS上从未支持过“垃圾回收机制”
 Retain     递增保留计数
 release    递减保留计数
 autorelease    稍后清理“自动释放池”时,再递减保留计数
 
 对象被创造出来,保留计数至少为1。如果想让他继续存活,使用retain增加保留计数.
 

 如果调用release之后,基于某些原因,其引用计数会降到0,被系统收回。如果再次调用会导致崩溃。为避免在不经意间使用无效对象,用完release后会清空指针,这样保证不会出现“野指针”。

NSMutableArray *array = [[NSMutableArray alloc] init];
    NSNumber *number = [[NSNumber alloc] initWithInt:1337];
    [array addObject:number];
    [number release];
    number = nil;

 
 属性存取方法中的内存管理
 如果属性为“strong关系”,则设置的属性值会保留。

 例如:

-(void)setFoo:(id)foo{
    [foo retain];
    [_foo release];
    _foo = foo;
}

 顺序很重要,假如还未保留新值就把旧值释放了,两个值又指向了同一个对象。先执行的release操作就可能导致系统将对象永久回收。实例变量就变成了野指针。
 
 自动释放池

 autorelease,此方法会在稍后递减计数,通常是在下一次“事件循环”时递减。

-(NSString *)stringValue {
    NSString *str = [[NSString alloc] initWithFormat:@"ssss: %@", self];
    return [str autorelease];
}

此时返回的str对象其保留计数比期望多1,alloc会令保留计数+1。保留计数多1,必须设法将其抵消。但是不能在方法内释放str,否则方法还没返回,系统就把str回收了。这里应该用autorelease,它会稍后释放对象。此方法可以保证对象在跨越“方法调用边界”后一定存活。实际上,释放操作会在清空最外层的自动释放池时执行。
 autorelease能延长对象生命期,使其在跨越方法调用边界后依然可以存活一段时间。
 
 保留环
 使用引用计数机制时,经常要注意“循环引用”,就是互相引用多个对象导致内存泄露。采用“弱引用”来解决问题。
 
 总结:
 1.引用计数机制通过可以递增递减的计数器来管理内存。对象创建好之后,其保留计数至少为1。若保留计数为正,则对象继续存活。当保留计数降为0时,对象被销毁。
 2.在对象生命周期中,其余对象通过引用来保留或释放此对象。保留与释放操作分别会递增及递减保留计数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值