Порядок освобождения от наследства?

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


person fuzzygoat    schedule 16.09.2009    source источник


Ответы (2)


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

[super dealloc];

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

Так что в основном да, вы правы.

person bobDevil    schedule 16.09.2009
comment
Спасибо, просто для справки, действительно ли Celestial [super dealloc] в конечном итоге освобождает и свой родительский NSObject? или он для этого работает иначе? - person fuzzygoat; 17.09.2009
comment
Да. Пока каждый подкласс работает нормально и вызывает [super dealloc] в конце освобождения, NSObject будет вызывать его метод dealloc. - person bobDevil; 17.09.2009

С -dealloc нет никакой магии.

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

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

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

person bbum    schedule 16.09.2009