在我目前的测试中,我有一个继承自“celestialClass”的类“PlanetClass”。我的问题是当我发布我的“PlanetClass”对象时,它会通过两个dealloc方法,首先释放Planet对象然后释放Celestial对象。我将dealloc添加到天体以确保我可以释放iVar“bodyName”,我想我有这个权利我只是想检查一下?
@implementation CelestialClass
- (NSString *)bodyName {
return [[bodyName retain] autorelease];
}
- (void)setBodyName:(NSString *)newBodyName {
if (bodyName != newBodyName) {
[bodyName release];
bodyName = [newBodyName copy];
}
}
- (void) dealloc {
NSLog(@"_deal_CB: %@", self);
[bodyName release];
bodyName = nil;
[super dealloc];
}
@end
@implementation PlanetClass
- (int *)oceanDepth {
return oceanDepth;
}
- (void)setOceanDepth:(int *)value {
oceanDepth = value;
}
- (void) dealloc {
NSLog(@"_deal: %@", self);
[super dealloc];
}
@end
欢呼 - 加里 -
答案 0 :(得分:3)
什么会发生Planet类的任何实例都会在那里调用dealloc,然后它会调用
[super dealloc];
调用天体类dealloc,允许释放bodyName。
所以基本上,是的,你做得对。
答案 1 :(得分:1)
-dealloc没有魔力。
当您调用[super dealloc]
时,它的工作方式与任何其他方法中对超类的任何其他调用完全相同。
这正是为什么对[super dealloc]
的调用必须始终是dealloc方法中的最后一行的原因。如果不是,你将调用NSObject的-dealloc,它会释放对象,从-dealloc返回,然后尝试用self或self的实例变量做一些事情,导致崩溃。
所以,是的,你的代码 - 正如所写 - 是正确的。