Dealloc не называется в суперклассе - PullRequest
0 голосов
/ 19 марта 2012

Я вижу странное поведение, которое я не понимаю. У меня есть вспомогательный класс HelperClass, который выделяется и сохраняется в суперклассе SuperClass.

В функции dealloc суперкласса я освобождаю HelperClass. Это все хорошо. Но когда я создаю подкласс, HelperClass освобождается, но в HelperClass dealloc по какой-то причине не вызывается. Это работает, когда я выпускаю HelperClass в подклассе.

Есть идеи, как это может быть?

(Edit: кажется, работает нормально, если я явно называю [HelperClass dealloc] вместо [HelperClass release], но это ли правильный способ сделать это?)

@interface SuperClass : UIViewController {

    @protected
    PlayerHelper* _mediaPlayerHelper;    
}

@end

Инициировано в:

- (void)viewDidLoad
{
    [super viewDidLoad];            
    // Add observer/helper for audio events
    _mediaPlayerHelper = [[[PlayerHelper alloc] init:self] retain];
}

С dealloc:

- (void) dealloc {
    if(_mediaPlayerHelper != nil) {
        [_mediaPlayerHelper release];
    }

    [super dealloc];
}

Если я подкласс это, как:

@interface SubClass : SuperClass

И выпустить этот класс, HelperClass не будет должным образом освобожден. Это работает, если я освобождаю помощника специально в подклассе. При освобождении подкласса вызывается dealloc суперкласса, но не dealloc в помощнике.

Помощник - это простой класс NSObject:

@interface PlayerHelper : NSObject

1 Ответ

2 голосов
/ 19 марта 2012

Вы дважды удерживаете здесь

[[[PlayerHelper alloc] init:self] retain];

вместо этого используйте:

[[PlayerHelper alloc] init:self];

http://interfacelab.com/objective-c-memory-management-for-lazy-people/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...