5

AFAIK, __block se usa cuando está cambiando, dentro del bloque, la dirección a la que apunta una variable (declarada fuera del bloque).¿ARC me dirá cuándo debo usar __block?

Pero, ¿qué sucede si estoy cambiando el valor al que apunta la variable pero el puntero permanece igual? Por ejemplo, ¿y si tengo NSMutableArray *array y solo estoy haciendo [array addObject:object] dentro del bloque? En este caso, no cambiaré el puntero array, pero estoy cambiando el valor al que apunta. Entonces, ¿debo seguir usando __block al declarar NSMutableArray *array?

Respuesta

19

Solo necesita __block si está cambiando el valor de la variable.

I.e. si tiene:

NSArray* foo; 

Sólo es necesario __block si cambia el valor de foo. Ahora, tenga en cuenta que foo no es más que "un puntero a una cosa que se escribe NSArray". Es decir. foo es efectivamente un entero de 64 o 32 bits, dependiendo de la plataforma. Si cambia ese número entero, necesita __block. Si no lo hace, no necesita __block.

Así que no, no es necesario llamar a __blockaddObject: en la matriz, ya que no en realidad está cambiando el valor de foo.

Si tuviera que hacer algo como foo = (expression);, entonces necesitaría __block.

(tenga en cuenta que esta es una de las razones por las cuales la programación concurrente bajo OO es tan condenadamente difícil ... es excepcionalmente difícil de definir el "dominio de la varianza" para cualquier ruta de ejecución dada)

+0

¿Qué hay de optimización del compilador ? '__block' podría indicar que un objeto nunca cambia, y si' NSArray' estaba en línea, las llamadas posteriores a la capacidad podrían haber sido incorrectas. – Dani

+2

'__block' indica que la variable puede cambiar. Independientemente de si la variable es '__block' o una copia const (como es la predeterminada), no se verá afectado llamar a un método en el objeto. – bbum

+0

Pero, ¿qué sucede si la variable (NSArray *) es una propiedad propia? ¿Es necesario agregar el bloque __? – Amnysia

Cuestiones relacionadas