Что отвечает за освобождение объектов NSWindowController?
-
06-07-2019 - |
Вопрос
Допустим, я отображаю окно следующим образом:
[[TBAddTaskWindowController новый] Показать окно:self];
Где находится объект TBAddTaskWindowController, предназначенный для освобождения?Является ли общим решением вызов [self release] в windowWillClose?
Кажется неправильным, чтобы какой-либо другой объект "владел" окном, потому что оно должно существовать до тех пор, пока пользователь не закроет его.
Решение
Тот же код, который инстанцировал оконный контроллер, посылая классу сообщение new
, точно так же, как если бы это было сделано alloc
и init
сообщения.
Другие советы
Да, распространенный способ освободить оконный контроллер - это использовать:
- (void)windowWillClose:(NSNotification *)notification
{
[self autorelease];
}
Оконный контроллер должен работать только до тех пор, пока окно находится рядом, поэтому его автоматическое обновление, когда окно исчезает, имеет смысл.
Не забудьте также удалить всех других наблюдателей и т.д.
[добавлена информация для работы в ARC]
Для ARC вам необходимо сохранить строгую ссылку на элемент управления window, пока окно открыто, а затем удалить ее, когда окно закроется.
Чтобы сделать это, я добавил категорию в окно, управляемое двумя методами:
pnl_addWindowController
— вызывается оконным контроллером при первом открытии окнаpnl_removeWindowController
— звонил изwindowWillClose
Категория поддерживает глобальный NSMutableSet
активных оконных контроллеров.Код, по сути, просто [gWindowControllers addObject:self]
и [gWindowControllers removeAllObjects]
, с некоторым ленивым созданием NSMutableSet и некоторой блокировкой.