O que é responsável por liberar objetos NSWindowController?
-
06-07-2019 - |
Pergunta
Vamos dizer que eu exibir uma janela assim:
[[TBAddTaskWindowController novo] SHOWWINDOW: self];
Onde está o objeto TBAddTaskWindowController feito para ser lançado? É a solução genérica para chamada [liberação auto] em windowWillClose?
Ele não se sente bem para ter qualquer outro objeto "próprio" a janela, porque está destinado a existir até que o usuário fecha-lo.
Solução
O mesmo código que instanciado o controlador de janela, enviando a mensagem new
para a classe, da mesma forma como se tivesse feito isso por mensagens alloc
e init
.
Outras dicas
Sim, uma maneira comum de fazer soltar o controlador de janela é com:
- (void)windowWillClose:(NSNotification *)notification
{
[self autorelease];
}
O Controlador Janela precisa para viver somente enquanto a janela estiver ao redor, assim autoreleasing-lo quando a janela vai embora faz todo o sentido.
Lembre-se de remover quaisquer outros observadores, etc também.
[Informação adicionada para trabalhar sob ARC]
Para ARC, você precisa manter uma forte referência para o controle janela enquanto a janela está aberta, e depois removê-lo quando os fecha a janela.
Para fazer isso, eu adicionei uma categoria na janela controlada com dois métodos:
-
pnl_addWindowController
- chamado pelo controlador de janela quando a janela é aberta pela primeira vez -
pnl_removeWindowController
- chamado dewindowWillClose
A categoria mantém uma NSMutableSet
mundial de controladores de janela ativa. O código é essencialmente apenas [gWindowControllers addObject:self]
e [gWindowControllers removeAllObjects]
, com alguma criação preguiçoso do NSMutableSet e alguns de bloqueio.