ARC, Nib-файлы и освобождение объектов верхнего уровня - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть собственный объект контроллера, который загружает файл Nib, например:

- (id)init {
    self = [super init];
    if (self) {
        [NSBundle loadNibNamed:@"AccountSetup" owner:self];
    }
    return self;
}

Файл Nib содержит один элемент NSTabView. Я заметил, что при освобождении моего пользовательского объекта контроллера представление вкладки не высвобождается вместе с ним .

Мой пользовательский объект контроллера расширяется NSViewController, и из того, что я прочитал в документации (1), объекты верхнего уровня в Nib должны автоматически освобождаться, если владелец файла расширяет NSViewController:

Если владелец файла не является экземпляром NSWindowController или NSViewController , тогда вам нужно уменьшить счетчик ссылок верхний уровень возражает сам.

Если я освобождаю вид вкладки в dealloc пользовательского контроллера, он исчезает правильно, но мне интересно, если я что-то упустил или документы в этом конкретном случае просто не очень точные.

1) https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html#//apple_ref/doc/uid/10000051i-CH4-SW18

1 Ответ

1 голос
/ 23 февраля 2012

Если ваш контроллер является подклассом NSViewController, то вы используете его неправильно и обходите его механизм загрузки пера.Вы должны сделать это:

- (id)init 
{
    self = [super initWithNibName:@"AccountSetup" bundle:nil];
    if (self) 
    {
        //perform any initializations
    }
    return self;
}

Обойдя метод initWithNibName:bundle: и используя метод NSBundle напрямую, вы не позволяете NSViewController управлять объектами верхнего уровня в пиру.

...