Objective c 继承释放令?

Objective c 继承释放令?,objective-c,memory,dealloc,Objective C,Memory,Dealloc,在我当前的测试中,我有一个继承自“celestialClass”的类“PlanetClass”。我的问题是,当我释放我的“PlanetClass”物体时,它会经历两种释放方法,首先释放行星物体,然后释放天体。我把dealloc添加到了仙界,以确保我可以发布iVar“bodyName”,我想我有这个权利,我只是想检查一下 @implementation CelestialClass - (NSString *)bodyName { return [[bodyName retain] aut

在我当前的测试中,我有一个继承自“celestialClass”的类“PlanetClass”。我的问题是,当我释放我的“PlanetClass”物体时,它会经历两种释放方法,首先释放行星物体,然后释放天体。我把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

干杯-加里-

发生的事情是行星类的任何实例都将在那里调用dealloc,然后它将调用dealloc

[super dealloc];
它调用了天体类dealloc,允许bodyName被释放


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

行星类的任何实例都会在那里调用dealloc,然后调用

[super dealloc];
它调用了天体类dealloc,允许bodyName被释放


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

没有-dealloc的魔力

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

这就是为什么调用
[super dealloc]
必须始终是dealloc方法中的最后一行。如果不是,则调用NSObject的-dealloc,它将解除对象的分配,从-dealloc返回,然后尝试对self或self的实例变量执行某些操作,从而导致崩溃


所以,是的,您的代码——正如编写的一样——是正确的

使用-dealoc没有魔力

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

这就是为什么调用
[super dealloc]
必须始终是dealloc方法中的最后一行。如果不是,则调用NSObject的-dealloc,它将解除对象的分配,从-dealloc返回,然后尝试对self或self的实例变量执行某些操作,从而导致崩溃


所以,是的,您的代码——正如编写的一样——是正确的

谢谢,仅供参考,“天体”[super dealloc]最终是否也会释放其父对象?或者它的工作原理不同吗?是的。只要每个子类都能很好地发挥作用,并在dealloc结束时调用[super dealloc],NSObject就会调用它的dealloc方法。谢谢,仅供参考,“天球”[super dealloc]最终也会释放它的父NSObject吗?或者它的工作原理不同吗?是的。只要每个子类都能很好地发挥作用,并在dealloc结束时调用[super dealloc],NSObject就会调用它的dealloc方法。