2012-08-01 8 views
6

Estoy bastante confundido acerca de cómo cambiar una variable de instancia dentro de un bloque.Cambiar una variable de instancia en un bloque

El archivo de interfaz (.h):

@interface TPFavoritesViewController : UIViewController { 
    bool refreshing; 
} 

La aplicación:

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

Como se puede adivinar, consigo un ciclo de retener la advertencia cuando trato de cambiar el interior de Ivar refrescante el bloque. ¿Cómo haría esto sin obtener un error?

Respuesta

6

su asignación a refreshing es una referencia implícita a self, que es la abreviatura de:

self->refreshing = YES; 

de ahí la advertencia ciclo. Cámbielo a:

temp_self->refreshing = YES; 
+2

No se compila solo con este código. Me aparece el siguiente error: No se permite la desreferencia de __weak debido a un posible valor nulo causado por una condición de carrera, asígnelo primero a una variable fuerte. Creo que lo hice funcionar agregando esto: __truerte TprideListView * strong_self = temp_self; strong_self-> refreshing = YES; –

+0

cuidado; Desreferenciar un puntero débil puede provocar bloqueos. Es mejor hacer un puntero fuerte que el débil dentro del bloque, comprobar si es nulo y usarlo. –

+0

@KeiranPaster - disculpas Me perdí la segunda advertencia; si su código mantiene a raya las advertencias, está funcionando * siempre que * su objeto se quede (es decir, 'self 'es válido); el código no trata la posibilidad de un valor 'nil'. Supongo que sabes que lo es, si no lo haces ... – CRD

Cuestiones relacionadas