Acceso a una matriz C de bloques dentro de un bloque

Tengo una matriz de bloques C definida como esta:

void (^block1)() = ^void() { doSomething1(); doSomething2(); }; void (^block2)() = ^void() { doSomething3(); doSomething4(); }; // etc. typedef void (^myBlockType)(); myBlockType arrayBlock[2]; arrayBlock[0] = block1; arrayBlock[1] = block2; 

pero luego estoy tratando de acceder a esa matriz C desde el interior de un bloque, algo así

 void (^adjust)(int value) = ^void(int value) { myBlockType myBlock = arrayBlock[value]; }; 

y Xcode se queja con

No se puede hacer reference a la statement con un tipo de matriz dentro del bloque.

Si se trataba de una serie de cosas como flotadores, integers, etc., hay esta solución, pero ¿cómo hacer eso para una matriz C de bloques?

Puedo

  myBlockType array = calloc(2, sizeof(myBlockType)); 

? ¿Es este el enfoque correcto? En ese caso, ¿cómo inicializo los valores?

Bien, algunos indicadores después de la pista de comentarios, pero necesitas aprender y entender lo que está sucediendo aquí .

Puedo

 myBlockType array = calloc(2, sizeof(myBlockType)); 
  • En C arrays, los pointers están estrechamente interrelacionados. En la matriz C Tx T x[n] el nombre x tiene el tipo T * – un puntero. La operación de índice x[n] se define como la misma que *(x + n) usando las operaciones de puntero ( * y + ). Entonces puede tratar una matriz como un puntero y un puntero como una matriz, por ejemplo, puede "indexar" un puntero.
  • Como has descubierto, no puedes capturar una variable de matriz local en un bloque.
  • Puede capturar una variable con valor de puntero, pero es su responsabilidad asegurarse de que lo apuntado sea válido.
  • Su idea de calloc es una solución posible, pero los types son incorrectos, la array debe declararse como puntero.
  • Además, si está utilizando ARC (más que probable) y almacenando pointers de tipo de object retenible , por ejemplo references a objects o bloques, el tipo de array debe include un calificador de propiedad . Probablemente debería usar __strong para que su "matriz" posea los elementos que hace reference como lo hace un NSArray .
  • Para cualquier cosa que calloc (o malloc et al ), usted es responsable de llamar free si es necesario.

Entienda esas balas y sus posibles soluciones (hay más de una) simplemente se caen.

HTH