OK, entonces Apple nos trajo ARC, lo cual es genial. Después de refacturar mi Aplicación a ARC, casi todo funciona bien y ahora es mucho más fácil de desarrollar y mantener.Convirtiendo objetos de auto-liberación a ARC
Solo hay un problema que todavía no puedo resolver.
Mi programa de administración de trabajos muestra información detallada de propuestas, pedidos, etc. en sus propias ventanas. Así que tengo una clase especial donde WindowControllers consigue asignan y se iniciaron con initWithWindowNibName y luego la ventana se muestra con SHOWWINDOW:
DetailWindowController *proposalWindowController = [[DetailWindowController alloc] initWithWindowNibName:@"ThePorposalWindow"];
[proposalWindowController showWindow:nil];
Antes ARC la instancia de la WindowController hizo la liberación como se muestra en la documentation:
- (void)windowWillClose:(NSNotification *)notification
{
[self autorelease];
}
Pero ahora con ARC esto ya no es posible y lo que empeora aún más, en mi clase especial donde se asigna e inicia el WindowController, ARC lanza el mismo windowController porque no hay ningún puntero al WindowController.
Mi idea era copiar el windowController en una matriz mutuable:
[proposalWindowArray addObject:proposalWindowController];
[[proposalWindowArray lastObject] showWindow:nil];
Y en el método windowControllers delegado windowWillClose puedo enviar una notificación a mi clase especial:
- (void)windowWillClose:(NSNotification *)notification
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"ProposalWindowWillClose" object:[[self window] windowController] userInfo:nil];
}
En mi clase especial Escucho la notificación y elimino el objeto de la matriz:
- (void) proposalWindowWasClosed: (NSNotification *) notification
{
[proposalWindowArray removeObjectIdenticalTo:[notification object]];
}
Funciona, pero sigo sin creer que esta sea la forma correcta.
¿Alguien tiene el mismo problema o un consejo para mejorarlo?
Su nuevo método es básicamente correcto. Con ARC, debe mantener referencias explícitas a los objetos para que el compilador pueda rastrear correctamente las llamadas retener/liberar. De hecho, creo que debes evitar los trucos como llamar a 'liberación' en los métodos de devolución de llamada en general, ya sea que uses ARC o no. –
@RobKeniger: ¿Qué sugieres en su lugar? Imagina que estamos en el delegado de la aplicación que envía acciones recibidas para ver/controladores de ventana y generalmente hay muchos controladores diferentes involucrados. Crear una propiedad para cada uno parece innecesario. –