0

現在のテストでは、「celestialClass」から継承するクラス「PlanetClass」があります。私の質問は、「PlanetClass」オブジェクトを解放すると、両方のdeallocメソッドを通過し、最初にPlanetオブジェクトを解放し、次にCelestialオブジェクトを解放することです。iVar "bodyName"をリリースできるように、deallocをcelestialに追加しました。確認したかったのは、この権利があると思いますか?

@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

乾杯-gary-

4

2 に答える 2

3

何が起こるかというと、Planetクラスのインスタンスはそこでdeallocを呼び出し、次に呼び出します

[super dealloc];

これは天体クラスdeallocを呼び出し、bodyNameを解放できるようにします。

だから基本的に、はい、あなたはそれを正しく持っています。

于 2009-09-16T21:52:23.017 に答える
1

-dealloc には魔法はありません。

を呼び出す[super dealloc]と、他のメソッドでスーパー クラスを呼び出す場合とまったく同じように機能します。

これがまさに、への呼び出しが[super dealloc]常に dealloc メソッドの最後の行でなければならない理由です。そうでない場合は、NSObject の -dealloc を呼び出して、オブジェクトの割り当てを解除し、-dealloc から戻り、self または self のインスタンス変数で何かを実行しようとすると、クラッシュが発生します。

そうです、あなたのコード (書かれているとおり) は正しいです。

于 2009-09-16T22:38:05.053 に答える