HASTA DONDE SE, __block
se usa cuando está cambiando, dentro del bloque, la dirección a la que apunta una variable (declarada fuera del bloque).
Pero, ¿qué pasa si estoy cambiando el valor al que apunta la variable pero el puntero permanece igual? Por ejemplo, ¿qué pasa si tengo NSMutableArray *array
y solo estoy haciendo [array addObject:object]
dentro del bloque? En este caso, no estoy cambiando el puntero array
, pero estoy cambiando el valor al que apunta. Entonces, ¿debo seguir usando __block
al declarar NSMutableArray *array
?
Respuestas
19 para la respuesta № 1Solo necesitas __block
si está cambiando el valor de la variable
Es decir. si usted tiene:
NSArray* foo;
Solo necesitas __block
si cambia el valor de foo
. Ahora, tenga en cuenta que foo
no es más que "un puntero a una cosa que está escrita NSArray
". foo
es efectivamente un entero de 64 o 32 bits, según la plataforma. Si cambia ese número entero, necesita __block
. Si no lo necesitas, no necesitas __block
.
Entonces, no, no necesitas __block
llamar addObject:
en la matriz ya que en realidad no está cambiando el valor de foo
.
Si tuvieras que hacer algo como foo = (expression);
, entonces necesitarías __block
.
(tenga en cuenta que esta es una de las razones por las cuales la programación concurrente bajo OO es tan difícil ... es excepcionalmente difícil definir el "dominio de la variación" para cualquier ruta de ejecución dada)