Я ищу дальнейшие разъяснения после просмотра Что несет ответственность за выпуск объектов 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] традиционно рекомендованным, и только теперь, когда у нас есть статический анализ, это проблема?