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];
}
}//当旧对象和新对象不同时,会释放掉旧对象,保留新对象
当两个对象相同时,不会做任何事情
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];
}
}//当旧对象和新对象不同时,会释放掉旧对象,保留新对象
当两个对象相同时,不会做任何事情