2012-08-01 15 views
6

Jestem dość zdezorientowany, jak zmienić zmienną instancji wewnątrz bloku.Zmiana zmiennej instancji w bloku

Plik interfejs (.h):

@interface TPFavoritesViewController : UIViewController { 
    bool refreshing; 
} 

Realizacja:

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

Jak można się domyślać, otrzymuję ostrzeżenie zachować cyklu, gdy próbuję zmienić orzeźwiający ivar od wewnątrz blok. Jak mógłbym to zrobić bez otrzymania błędu?

Odpowiedz

6

Twoje zadanie do refreshing jest ukryte odniesienie do self jest skrótem dla:

self->refreshing = YES; 

Stąd ostrzeżenie cykl. Zmień to na:

temp_self->refreshing = YES; 
+2

Nie kompiluje się tylko z tym kodem. Pojawia się następujący błąd: Wyłuskanie __weak nie jest dozwolone z powodu możliwej wartości pustej spowodowanej przez stan wyścigu, najpierw przypisz ją do silnej zmiennej. Myślę, że działałem, dodając: __strong TPRideListView * strong_self = temp_self; strong_self-> refreshing = YES; –

+0

Ostrożnie; dereferencja słabego wskaźnika może doprowadzić do awarii. Lepiej zrobić silny wskaźnik ze słabego wewnątrz bloku, sprawdzić zero i użyć tego. –

+0

@KeiranPaster - przepraszam za drugim ostrzeżeniem; jeśli twój kod utrzymuje ostrzeżenia w tajemnicy, działa to * pod warunkiem, że * twój obiekt pozostaje w pobliżu (tzn. 'self' jest ważny); kod nie zajmuje się wartością 'nil'. Zakładam, że wiesz, że to jest, jeśli nie ... – CRD

Powiązane problemy