Ho un controller di visualizzazione che desidero inizializzare lentamente e, una volta inizializzato, utilizzare la stessa copia quando possibile (non uso un singleton poiché desidero rimuoverlo dalla memoria) , io uso il getter di farlo, il mio codice simile a questa:Inizializzazione pigro sicuro di thread su iOS
@property (retain) UIViewController *myController
...
@synthesize myController = _myController;
...
- (UIViewController *)myController
{
if (!_myController) { // Evaluation
_myController = [[MyViewController alloc] init]; // Object Creation
}
return _myController;
}
questo funziona, ma non è thread-safe, e se più di un thread valutare a true prima che venga creato l'oggetto, dovrò una perdita di memoria. Una soluzione che ho provato è di sincronizzare il codice @, ma non sono sicuro del modo corretto di farlo.
Questo sembra funzionare, (lockForMyController è un semplice NSString) ma rende questa sezione di codice molto più lento:
- (UIViewController *)myController
{
@synchronized(self.lockForMyController){
if (!_myController) {
_myController = [[MyViewController alloc] init];
}
}
return _myController;
}
mi chiedevo se c'è qualche altro modo per raggiungere un pigro inizializzato, filo sicuro, proprietà?
Ho problemi ad adattarlo. Posso farlo funzionare come un singleton, ma poi ho problemi quando uso '[_myController release]; _myController = nil; 'e poi provo a crearlo nuovamente, dal momento che non posso resettare la variabile' dispatch_once_t once' statica. – Yamanqui
Hmm lascia che aggiorni la mia domanda con un suggerimento che dovrebbe funzionare. – logancautrell
Grazie mille, la soluzione aggiornata funziona perfettamente. – Yamanqui