2012-08-01 12 views
6

Ich bin ziemlich verwirrt darüber, wie man eine Instanzvariable innerhalb eines Blocks ändert.Ändern einer Instanzvariable in einem Block

Die Interface-Datei (.h):

@interface TPFavoritesViewController : UIViewController { 
    bool refreshing; 
} 

Die Umsetzung:

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

Wie Sie sich vorstellen, erhalte ich eine Warnung Zyklus behalten, wenn ich die erfrischende Ivar innen zu ändern versuchen der Block. Wie würde ich dies tun, ohne einen Fehler zu bekommen?

Antwort

6

Ihre Zuordnung zu refreshing ist eine implizite Bezugnahme auf self, ist es eine Abkürzung für:

self->refreshing = YES; 

daher der Zyklus Warnung. Ändern Sie es in:

temp_self->refreshing = YES; 
+2

Es wird nicht nur mit diesem Code erstellt. Ich erhalte den folgenden Fehler: Die Dereferenzierung eines __weak ist aufgrund des möglichen Nullwerts, der durch eine Race Condition verursacht wird, nicht erlaubt. Weisen Sie ihn zuerst einer starken Variablen zu. Ich denke, ich habe es funktioniert, indem ich das hinzufügen: __strong TPRideListView * strong_self = temp_self; strong_self-> erfrischend = JA; –

+0

Vorsichtig; Der Dereferenzierung eines schwachen Zeigers kann zu Abstürzen führen. Es ist besser, einen starken Zeiger vom schwachen innerhalb des Blocks zu machen, nach Null zu suchen und diesen zu benutzen. –

+0

@KeiranPaster - Entschuldigung Ich habe die zweite Warnung verpasst; Wenn Ihr Code die Warnungen in Schach hält, ist es in Ordnung, Sie haben es funktioniert * vorausgesetzt * Ihr Objekt bleibt herum (d. h. "Selbst" ist gültig); Der Code behandelt nicht die Möglichkeit eines "Null" -Wertes. Ich nehme an, du weißt es ist, wenn du nicht ... – CRD

Verwandte Themen