问题来自那本很经典的o c学习书,就是那本黑壳青橘的那本objective-c基础教程。
讲的是一个Car类,其内部有一个Engine*engine实例变量,还有一个-(void)setEngine方法;
这里是在讲对象所有权;
这里讲如果编写setEngine方法的第一个版本,结果可能如下:
-(void)setEngine:(Engine*)newEngine
{
engine=[newEngine retain];
}
然后讲这种方法不行,因为在main函数出现以下调用顺序会有问题:
Engine *engine1=[Engine new];
[car setEngine:engine1];
[engine1 release];
Engine *engine2=[Engine new];
[car setEngine:engine2];
说是会出现内存泄漏,main函数已经释放了对engine1对象的引用,但是car类没有释放engine1对象;
于是说另一种尝试能解决这个问题:
-(void)setEngine:(Engine*)newEngine
{
[engine release];
engine=[newEngine retain];
}
为什么这样就可以了?
我想的是一开始car引用engine1的时候内部本来就没有引用任何engine对象,一开始就来[engine release]的作用是什么,如果不起任何作用这样engine1不是一样会内存泄漏吗?
然后书上又讲其实这样的改动不能解决当newEngine和engine对象是同一个对象的时候的情况
举例:
Engine *engine=[Engine new];
Car *car1=[Car new];
Car *car2=[Car new];
[car1 setEngine:engine];
[engine release];
[car2 setEngine:[car1 engine]];
说的是当执行了[engine release]这一步后newEngine和engine都会指向刚释放的内存区,会引发错误。
对于他的举例来说setEngine内部的那句【engine release]中的engine指的是Car类内部的engine还是Engine *engine=[Engine new]里面的engine呢?