2012-08-01 11 views
6

Sono abbastanza confuso su come modificare una variabile di istanza all'interno di un blocco.Modifica di una variabile di istanza in un blocco

Il file di interfaccia (h):

@interface TPFavoritesViewController : UIViewController { 
    bool refreshing; 
} 

L'implementazione:

__weak TPFavoritesViewController *temp_self = self; 
refreshing = NO; 
[myTableView addPullToRefreshWithActionHandler:^{ 
    refreshing = YES; 
    [temp_self refresh]; 
}]; 

Come si può immaginare, ho un avvertimento mantenere ciclo quando provo a cambiare l'Ivar rinfrescante interno il blocco. Come farei questo senza ottenere un errore?

risposta

6

Il tuo compito a refreshing è un riferimento implicito alla self, è una scorciatoia per:

self->refreshing = YES; 

qui l'avvertimento ciclo. Cambiarlo a:

temp_self->refreshing = YES; 
+2

Non crea solo con questo codice. Ricevo il seguente errore: non è consentito il dereferenziamento di un __bordo a causa di un possibile valore nullo causato da una condizione di competizione, assegnarlo prima a una variabile forte. Penso di averlo funzionato aggiungendo questo: __strong TPRideListView * strong_self = temp_self; strong_self-> refreshing = YES; –

+0

Attento; il dereferenziamento di un puntatore debole può causare incidenti. Meglio creare un puntatore forte da quello debole all'interno del blocco, controllare che sia zero e usarlo. –

+0

@KeiranPaster - scuse Ho perso il secondo avvertimento; se il tuo codice tiene a bada gli avvertimenti, lo fai funzionare * purché * il tuo oggetto rimanga intorno (ad esempio, 'self' è valido); il codice non si occupa della possibilità di un valore 'nil'. Presumo tu sappia che lo è, se non lo fai ... – CRD