Libere un nswindowcontroller cuando la ventana esté cerrada
-
27-10-2019 - |
Pregunta
Estoy construyendo una aplicación de cacao y tengo una pregunta sobre el uso de controladores de ventana. La idea es que si el usuario selecciona nuevo en la barra de menú, se crea una instancia de MyWindowController, que es una subclase de NSWindowController y se muestra una nueva ventana de mywindow.xib.
Estoy manejando la acción en el delegado de la aplicación. Por lo que he visto después de buscar algo como lo siguiente se podría hacer. Una vez que se muestra la ventana, ya no tengo ningún motivo para almacenar un puntero al controlador de la ventana y, dado que la asigné, también la realice antes de mostrar la ventana.
[[[[MyWindowController alloc] init] autorelease] showWindow:self];
Dado que la ventana se lanza poco después, la ventana se mostrará brevemente en la pantalla y luego se irá. He encontrado una solución en la que conservo el controlador de la ventana en el método -window: y dejo que se libere una vez que reciba una notificación de ventana.
- (IBAction)showWindow:(id)sender
{
[self retain];
[[NSNotificationCenter defaultCenter] addObserverForName:NSWindowWillCloseNotification
object:self.window
queue:nil
usingBlock:^(NSNotification *note) {
[self release];
}];
[super showWindow:sender];
}
¿Hay una mejor manera de hacer esto? He buscado en la documentación de Apple y no he encontrado nada sobre qué prácticas usar. Suena como algo muy básico que debería cubrir, así que tal vez solo estoy buscando con los términos equivocados.
Solución
Normalmente se aferraría al controlador de la ventana y solo lo liberaría cuando haya terminado con él. Diría que su delegado de aplicación sería responsable de eso. Simplemente guárdelos en una matriz si puede haber múltiples. Si bien su solución puede funcionar, no es muy elegante.
Si está trabajando en una aplicación Cocoa basada en documentos, crea el controlador de la ventana en el método de subclase de documento MakeWindowControllers y deja que esa clase mantenga un puntero en el controlador de su ventana.