继承释放顺序?

时间:2009-09-16 21:47:20

标签: objective-c memory dealloc

在我目前的测试中,我有一个继承自“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

欢呼 - 加里 -

2 个答案:

答案 0 :(得分:3)

什么会发生Planet类的任何实例都会在那里调用dealloc,然后它会调用

[super dealloc];

调用天体类dealloc,允许释放bodyName。

所以基本上,是的,你做得对。

答案 1 :(得分:1)

-dealloc没有魔力。

当您调用[super dealloc]时,它的工作方式与任何其他方法中对超类的任何其他调用完全相同。

这正是为什么对[super dealloc]的调用必须始终是dealloc方法中的最后一行的原因。如果不是,你将调用NSObject的-dealloc,它会释放对象,从-dealloc返回,然后尝试用self或self的实例变量做一些事情,导致崩溃。

所以,是的,你的代码 - 正如所写 - 是正确的。