Я ищу дальнейшие разъяснения после просмотра Что несет ответственность за выпуск объектов NSWindowController?
Я пишу простое приложение для управления запасами для своих племянников. У меня есть табличное представление, отображающее содержимое их "библиотеки" и т.д. Чтобы добавить новый элемент в библиотеку, они нажимают кнопку "+". Эта кнопка открывает новое окно с запросом деталей элемента и проверяет ввод, когда они нажимают "OK".
Все это работает отлично. Однако у меня есть вопрос об управлении памятью. Чтобы создать новое окно, я использую следующий код:
- (IBAction)addNewItem:(id)sender {
LibraryItemEditorController *editorController =
[[LibraryItemEditorController alloc]
initWithWindowNibName:@"LibraryItemEditor"];
[editorController showWindow:nil];
// editorController is "leaked" here, it seems.
}
Я не могу освободить (и не авторекламу) editorController
в конце addNewItem:
, потому что ничего не ссылается на editorController
; если я его отпущу, окно сразу исчезнет. Тем не менее, я хочу, чтобы оконный контроллер был освобожден после закрытия его окна. В Apple Руководство по программированию окон, я прочитал следующее:
Если вы хотите закрыть окно, чтобы сделать как оконный, так и оконный контроллер уйти, когда он не является частью документ, ваш подкласс
NSWindowController
может наблюдатьNSWindowWillCloseNotification
или, как делегат окна, выполнитеwindowWillClose:
и включить следующая строка кода в вашем реализация:[self autorelease];
Я использовал [self autorelease]
в методе windowWillClose:
контроллера окна. Это работает и не утечки памяти. Однако он просто чувствует себя некрасиво; addNewItem:
выглядит как утечка памяти, и статический анализ тоже так думает. Я знаю, что он действительно заботился о windowDidClose:
, но он просто чувствует себя не так. Кроме того, оконный контроллер теперь освобождает себя, не сохранив при этом себя. Все это противоречит правилам управления памятью, которые я узнал.
Моя другая опция - поставить ivar на родительский контроллер (либо NSWindowController
, либо NSMutableSet
of NSWindowController
s), а затем посмотреть на NSWindowWillCloseNotification
в родительском контроллере и отпустить его в ответ. Это чище, и, вероятно, я это сделаю. Тем не менее, это еще и большая работа, что приводит меня к моим вопросам.
Наблюдает за стандартным способом NSWindowDidCloseNotification
? Каков стандартный способ управления NSWindowControllers
, который создается и уничтожается по требованию? Является ли метод [self autorelease]
традиционно рекомендованным, и только теперь, когда у нас есть статический анализ, это проблема?