Что отвечает за освобождение объектов NSWindowController? - PullRequest
2 голосов
/ 23 июня 2009

Допустим, я отображаю окно примерно так:

[[TBAddTaskWindowController new] showWindow: self];

Где находится объект TBAddTaskWindowController, предназначенный для освобождения? Является ли универсальное решение для вызова [self release] в windowWillClose?

Неправильно иметь какой-либо другой объект, «владеющий» окном, потому что он должен существовать, пока пользователь не закроет его.

Ответы [ 2 ]

5 голосов
/ 23 июня 2009

Да, общий способ разблокировки оконного контроллера заключается в:

- (void)windowWillClose:(NSNotification *)notification
{
    [self autorelease];
}

Контроллер окна должен жить только до тех пор, пока окно вокруг него, поэтому автоматическое освобождение его при закрытии окна имеет смысл.

Не забудьте удалить других наблюдателей и т. Д.


[добавлена ​​информация для работы под ARC]

Для ARC вам необходимо сохранять четкую ссылку на элемент управления окном, пока оно открыто, а затем удалять его при закрытии окна.
Для этого я добавил категорию в окне, управляемом двумя способами:

  • pnl_addWindowController & mdash; вызывается оконным контроллером при первом открытии окна
  • pnl_removeWindowController & mdash; вызывается с windowWillClose

Категория поддерживает глобальные NSMutableSet активных оконных контроллеров. Код, по сути, просто [gWindowControllers addObject:self] и [gWindowControllers removeAllObjects], с небольшим созданием NSMutableSet и некоторой блокировкой.

2 голосов
/ 23 июня 2009

Тот же код, который инстанцировал оконный контроллер путем отправки сообщения new классу, точно так же, как если бы он делал это с помощью сообщений alloc и init.

...