OK, così Apple ci ha portato ARC, il che è fantastico. Dopo aver refactoring la mia applicazione su ARC quasi tutto funziona correttamente ed è molto più semplice da sviluppare e mantenere.Conversione di oggetti a rilascio automatico su ARC
C'è solo un problema che ancora non riesco a capire.
Il mio programma di gestione del lavoro mostra informazioni dettagliate sui dettagli di proposte, ordini e così via nelle loro finestre. Così ho una classe speciale in cui WindowControllers ottiene allocati e avviate con initWithWindowNibName e poi la finestra è mostrato con ShowWindow:
DetailWindowController *proposalWindowController = [[DetailWindowController alloc] initWithWindowNibName:@"ThePorposalWindow"];
[proposalWindowController showWindow:nil];
Prima ARC l'istanza del WindowController ha fatto il rilascio come mostrato nella documentation:
- (void)windowWillClose:(NSNotification *)notification
{
[self autorelease];
}
Ma ora con ARC questo non è più possibile e cosa lo rende ancora peggio, nella mia classe speciale in cui è allocato e avviato WindowController, la stessa finestra viene rilasciata da ARC perché non c'è alcun puntatore alla finestraController.
La mia idea era quella di copiare il windowController in un array mutuable:
[proposalWindowArray addObject:proposalWindowController];
[[proposalWindowArray lastObject] showWindow:nil];
E nel metodo windowControllers delegato windowWillClose ho posto una notifica alla mia classe speciale:
- (void)windowWillClose:(NSNotification *)notification
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"ProposalWindowWillClose" object:[[self window] windowController] userInfo:nil];
}
Nella mia classe speciale Ascolto la notifica e rimuovo l'oggetto dall'array:
- (void) proposalWindowWasClosed: (NSNotification *) notification
{
[proposalWindowArray removeObjectIdenticalTo:[notification object]];
}
Funziona, ma non credo ancora che questo sia il modo corretto.
Qualcuno ha lo stesso problema o un consiglio per renderlo migliore?
Il tuo nuovo metodo è fondamentalmente corretto. Con ARC, è necessario mantenere riferimenti espliciti agli oggetti affinché il compilatore sia in grado di tracciare correttamente le chiamate di mantenimento/rilascio. In realtà, penso che dovresti evitare trucchi come chiamare 'release' nei metodi di callback in generale, indipendentemente dal fatto che tu stia usando ARC. –
@RobKeniger: cosa suggerisci invece? Immaginiamo di essere presenti nel delegato dell'app che inoltra le azioni per visualizzare/controllare i controller e di solito sono coinvolti molti controller diversi. Creare una proprietà per ognuno sembra essere inutile. –