Qual è la responsabilità del rilascio di oggetti NSWindowController?
-
06-07-2019 - |
Domanda
Diciamo che visualizzo una finestra in questo modo:
[[TBAddTaskWindowController new] showWindow: self];
Dove si intende rilasciare l'oggetto TBAddTaskWindowController? La soluzione generica è chiamare [self release] in windowWillClose?
Non è giusto avere nessun altro oggetto "proprio" la finestra, perché è pensata per esistere fino a quando l'utente non la chiude.
Soluzione
Lo stesso codice che ha istanziato il controller della finestra inviando il messaggio new
alla classe, proprio come se lo avesse fatto con alloc
e init
messaggi.
Altri suggerimenti
Sì, un modo comune per rilasciare il controller della finestra è con:
- (void)windowWillClose:(NSNotification *)notification
{
[self autorelease];
}
Il controller della finestra deve vivere solo finché la finestra è in giro, quindi rilasciarla automaticamente quando la finestra va via ha perfettamente senso.
Ricorda di rimuovere anche qualsiasi altro osservatore, ecc.
[informazioni aggiunte per lavorare sotto ARC]
Per ARC, è necessario conservare un riferimento forte al controllo della finestra mentre la finestra è aperta, quindi rimuoverlo alla chiusura della finestra.
Per fare ciò, ho aggiunto una categoria nella finestra controllata con due metodi:
-
pnl_addWindowController
- chiamato dal controller della finestra alla prima apertura della finestra -
pnl_removeWindowController
- chiamato dawindowWillClose
La categoria mantiene un NSMutableSet
globale di controller di finestra attivi. Il codice è essenzialmente solo [gWindowControllers addObject: self]
e [gWindowControllers removeAllObjects]
, con qualche creazione pigra di NSMutableSet e alcuni blocchi.