2009-06-23 2 views
2

Допустим, у меня появляется окно, как так:Что несет ответственность за освобождение объектов NSWindowController?

[[TBAddTaskWindowController новый] ShowWindow: само];

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

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

ответ

2

Тот же код, который создавал оконный контроллер, отправив сообщение new в класс, точно так же, как если бы он сделал это alloc и init сообщений.

+0

Итак, в моем случае делегат приложения должен будет наблюдать за закрытием окна, а затем отпустить оконный контроллер? –

+0

Yup. Я не уверен, что вы получите уведомления о закрытии окна при завершении приложения, хотя я работаю над сообщением в блоге, которое несколько связано. –

+0

так как делать в ARC? –

5

Да, обычный способ выпустите контроллер окна с:

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

Контроллер Окна должен жить только до тех пор, как окно вокруг, так autoreleasing, когда окно уходит ком смысл.

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


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

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

  • pnl_addWindowController — называется контроллером окна, когда впервые открыл
  • pnl_removeWindowController — вызываемом из windowWillClose

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

+0

Как сделать в ARC? –

+0

@AnoopVaidya См. [Этот другой ответ] (http://stackoverflow.com/a/27180666/3991344), который основан на [анонимном предлагаемом редактировании] (http://stackoverflow.com/review/spected-edits/6336191). – Pokechu22

+1

Да, это было мое редактирование, я не заметил, что я не был зарегистрирован в этот момент. –

Смежные вопросы