Порядок освобождения наследства? - PullRequest
0 голосов
/ 17 сентября 2009

В моем текущем тесте у меня есть класс "PlanetClass", который наследуется от "celestialClass". Мой вопрос заключается в том, что когда я освобождаю свой объект "PlanetClass", он проходит через оба метода dealloc, сначала освобождая объект Planet, а затем объект Celestial. Я добавил Deloc в Celestial, чтобы убедиться, что я могу выпустить 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

ура -gary-

Ответы [ 2 ]

3 голосов
/ 17 сентября 2009

Что произойдет, если любой экземпляр класса Planet вызовет там dealloc, то он вызовет

[super dealloc];

Который вызывает небесный класс dealloc, позволяя освободить bodyName.

Так что, в принципе, да, вы все правильно поняли.

1 голос
/ 17 сентября 2009

Нет волшебства с -dealloc.

Когда вы вызываете [super dealloc], он работает точно так же, как и любой другой вызов суперкласса в любом другом методе.

Именно поэтому вызов [super dealloc] всегда должен быть последней строкой в ​​методе dealloc. Если это не так, вы бы вызвали функцию -dealloc от NSObject, которая освободила бы объект, вернулась из -dealloc, а затем попыталась бы что-то сделать с переменными экземпляра self или self, что привело бы к падению.

Итак, да, ваш код - как написано - правильный.

...