¿Trabajando con bloques?

En una entrevista que hice recientemente, me pidieron que pnetworkingiga el resultado de un segmento de código. Incluso si lo entendí bien, no pude explicar cómo lo obtuve. Este es el segmento de código.

int num =2; int (^ myblock)(void)=^{ return num*5; }; NSLog(@"my block call 1 %d",myblock()); num = 5; NSLog(@"my block call 2 %d",myblock()); 

¿Alguien puede explicar por qué la respuesta es 10 en ambas ocasiones? Gracias

La variable num se copy dentro del bloque si no está marcada con __bloque. Esto significa que el scope externo num y el número interno se mantienen en diferentes direcciones en la memory y el cambio no afecta al otro. Para obligar al comstackdor a usar la misma dirección, marque la variable con __bloque

La variable que se encuentra fuera del bloque no se puede cambiar excepto que agregue '__bloque' antes. Entonces el num siempre es igual a 2.

  __block int num =2; 

Entonces obtendrás 10 y 25

Agregue __bloque palabra key antes de la statement para que pueda acceder a la variable dentro del bloque.

  __block int num =2; int (^ myblock)(void)=^{ return num*5; }; NSLog(@"my block call 1 %d",myblock()); num = 5; NSLog(@"my block call 2 %d",myblock()); 

Prueba esto…

Como dice Ryan Hodson en su tutorial sobre Objective-C Blocks:

Las variables no locales se copyn y almacenan con el bloque como const variables, lo que significa que son de solo lectura. Tratar de asignar un nuevo valor a la variable make desde dentro del bloque arrojará un error de compilation.

num se define como una variable no local.

El hecho de que las variables no locales se copien como constantes significa que un bloque no solo tiene acceso a variables no locales, sino que crea una instantánea de ellas. Las variables no locales se congelan en el valor que contienen cuando se define el bloque, y el bloque siempre usa ese valor, incluso si la variable no local cambia más adelante en el progtwig.

Si quiere reflejar un nuevo valor de num en bloque, declare num como variable de bloque

 __block int num =2; // *** Declanetworking as block variable, value change will effect inside block *** 

Permite entenderlo solo con tu ejemplo.

Variable no local (no bloque) *

 int num =2; int (^ myblock)(void)=^{ return num*5; }; NSLog(@"my block call 1 %d",myblock()); num = 5; NSLog(@"my block call 2 %d",myblock()); 

Resultado:

mi llamada de bloque 1 10

mi llamada de bloque 2 10

variable de bloque *

 __block int num =2; int (^ myblock)(void)=^{ return num*5; }; NSLog(@"my block call 1 %d",myblock()); num = 5; NSLog(@"my block call 2 %d",myblock()); 

Resultado:

mi llamada de bloque 1 10

mi llamada de bloque 2 25