Выпуск NSWindowController, когда окно закрыто
Я строю приложение Какао и у меня есть вопрос об использовании оконных контроллеров. Идея состоит в том, что, если пользователь выбирает New из строки меню, создается экземпляр MyWindowController, который является подклассом NSWindowController, и отображается новое окно из MyWindow.xib.
Я обрабатываю действие в делегате приложения. Из того, что я увидел после поиска вокруг, можно сделать что-то вроде следующего. Как только окно отображается, у меня больше нет причин хранить указатель на оконный контроллер, и, поскольку я выделил его, я также автоматически высвобождаю его перед отображением окна.
[[[[MyWindowController alloc] init] autorelease] showWindow:self];
Поскольку окно открывается вскоре после этого, оно на короткое время отображается на экране и затем исчезает. Я нашел решение, где я сохраняю оконный контроллер в методе -showWindow: и позволяю ему выпустить себя после получения уведомления windowWillClose.
- (IBAction)showWindow:(id)sender
{
[self retain];
[[NSNotificationCenter defaultCenter] addObserverForName:NSWindowWillCloseNotification
object:self.window
queue:nil
usingBlock:^(NSNotification *note) {
[self release];
}];
[super showWindow:sender];
}
Есть лучший способ сделать это? Я искал документацию Apple и не нашел ничего, что можно использовать. Это звучит как что-то очень простое, что оно должно охватывать, так что, возможно, я просто ищу неправильные термины.
1 ответ
Обычно вы держитесь за оконный контроллер и отпускаете его только тогда, когда закончите с ним. Я бы сказал, что за это будет отвечать ваш делегат. Просто сохраните их в массиве, если их может быть несколько. Хотя ваше решение может работать, оно не очень элегантно.
Если вы работаете с приложением Cocoa на основе документов, вы создаете контроллер окна в своем методе подкласса документа makeWindowControllers и позволяете этому классу хранить указатель на ваш контроллер окна.
func windowShouldClose(_ sender: NSWindow) -> Bool {
#if DEBUG
let closingCtl = sender.contentViewController!
let closingCtlClass = closingCtl.className
print("\(closingCtlClass) is closing")
#endif
sender.contentViewController = nil // will force deinit.
return true // allow to close.
}