iOS内存管理加深理解

CPU *powerPC = [[CPU alloc]init];
Laptop *apple = [[Laptop alloc]init];
[apple setCPU:powerPC];
[powerPC release];

- (void) setCPU:(CPU *)cpu {
     _cpu = [cpu retain];
}//这里给powerPC对象进行retain,使得apple的_cpu实例拥有该对象的所有权,apple的_cpu实例拥有powerPC的所有权后所以负责释放这个实例


CPU *powerPC = [[CPU alloc] init];
Laptop *apple = [[Laptop alloc] init];
[apple setCPU:powerPC];
[powerPC release];
CPU *intel = [[CPU alloc] init];
[apple setCPU:intel];

- (void)setCPU:(CPU *)cpu {
     _cpu = [cpu retain];
}在这里第一次设置apple的CPU为powerPC时,powerPC的引用计数为2,释放之后变成1,但当apple更换CPU后又持有了intel实例,但是powerPC实例并没有消失而没有任何实例指向它了,这就造成了内存泄漏。
所以更改setCPU方法:
-(void)setCPU:(CPU *)cpu {
     [_cpu release];
_cpu = [cpu retain];
}//这里不必担心有什么问题,虽然第一次设置cpu时apple还没有任何cpu,也就是这是apple的cpu实例为nil,但是向nil发送消息时程序不会抛出异常,什么也不做。

上面似乎完美了,但是当两次的CPU都是一样时又会出现bug:
CPU *intel = [[CPU alloc] init];
Laptop *apple = [[Laptop alloc] init];
[apple setCPU:intel];
[intel release];
[apple setCPU:intel];

- (void)setCPU:(CPU *)cpu {
     _cpu = [cpu retain];
}//两次设置的CPU都是intel这样做会增加intel的引用计数,操作错误会导致内存泄漏。
所以对代码要加以改进:
- (void)setCPU:(CPU *)cpu {
     if (_cpu != cpu) {
     [_cpu release];
     _cpu = [cpu retain];
}
}//当旧对象和新对象不同时,会释放掉旧对象,保留新对象
当两个对象相同时,不会做任何事情
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值