E 'un modello comune nel mio codice per allocare un oggetto, lasciare che faccia alcune cose con un gestore di completamento e rilasciarlo nel gestore:Come posso rilasciare un oggetto con un gestore di completamento blocchi sotto ARC?
LongOperation *foo = [[LongOperation alloc] init];
[foo runWithCompletion:^{
// run some code and then:
[foo autorelease];
}];
Questo funziona abbastanza bene, ma quando tento di convertire il codice per ARC, Xcode giustamente si lamenta che non può semplicemente rilasciare il autorelease
dal blocco, dal momento che renderebbe l'oggetto foo
ottenere deallocato dopo aver lasciato l'ambito.
Quindi, qual è un buon modo per scrivere questo tipo di pattern sotto ARC? Potrei introdurre una variabile di istanza per foo
:
[self setFoo:[[LongOperation alloc] init]];
[foo runWithCompletion:^{
// run some code and then:
[self setFoo:nil];
}];
... ma il codice non sarei rientrante più.
Questo non risponde alla domanda è cosa fare quando il contesto che contiene foo è finito da tempo. Con questa soluzione, il frame dello stack che chiama [foo runWithCompletion:] deve bloccare fino a quando l'esecuzione non termina o rischia uno stack smasher. –