¿Por qué debe modificarse el valor de las variables locales en Block para ser declarado como __block type

Actualizar registros

Tiempo Revisión
12 de abril de 2020 Primer borrador

Prólogo

Recientemente, volví a leer "Programación avanzada de Objective-C para subprocesos múltiples y gestión de memoria de iOS y OS X" con cuidado. Cuando leí el capítulo del modo 2.2 Bloques, vi que las variables automáticas fueron interceptadas en el Bloque y reasignadas. Error de compilación para "Falta el modificador __block". Esto me hizo pensar un poco. Aquí describo mi pensamiento.

Pensando

Un ejemplo del libro.

Usa el objeto en el bloque
id array = [[NSMutableArray alloc] init];
void (^blk)(void) = ^{
  id obj = [[NSObject alloc] init];  
  [array addObject:obj];
};
  • El código anterior no es problema
Reasignar objetos en bloque
id array = [[NSMutableArray alloc] init];
void (^blk)(void) = ^{
    array = [[NSMutableArray alloc] init];
};
  • 编译 报错 : La variable no es asignable (falta el especificador de tipo de bloque)
  • Muchos materiales de referencia en Internet dicen que agregar el modificador __block a la variable puede resolver el problema. Pero no hablaron sobre la profundidad del problema.
Pensamiento inferior
  • En referencia a la implementación de Blocks en los capítulos posteriores de "Objective-C Advanced Programming iOS and OS X Multithreading and Memory Management", podemos saber que la estructura generada por Blocks capturará las variables utilizadas.
  • Indicador de memoria
  • Para las variables locales, Blocks captura el valor de esta variable local de forma predeterminada (es decir, MemoryObj), que puede modificarse por el contenido en la dirección de MemroyObj (esencialmente utilizando el operador de lenguaje C *)
  • Cuando se agrega el especificador __block, Blocks captura la dirección de memoria de esta variable local, es decir, el valor de Memroy (usando la operación & en lenguaje C para obtener la dirección de una variable), para que Blocks pueda pasar los datos en la memoria internamente. Modifique (* memroy = xxx), y puede afectar el exterior de los Bloques.
  • Las variables locales que no se modifican con __block se capturan dentro de Blocks, e incluso si se modifican, no tiene ningún sentido (el exterior no se ve afectado), por lo que el compilador diseñó este error de compilación al principio para evitar errores impredecibles.

Supongo que te gusta

Origin www.cnblogs.com/HelloGreen/p/12684033.html
Recomendado
Clasificación