¿Por qué no funciona este código de bloque C objetivo rudimentario?

Estoy tratando de entender los fundamentos de los bloques. Escribí esta simple prueba:

NSString *(^print_block) () = ^ (NSString *returned_string){
  return @"this block worked!";  
};

NSLog(@"%@", print_block);

Esperaba que la salida de la consola fuera "this block worked!", pero en cambio recibo una gran avalancha de números de error, etc., que terminan con:

terminate called throwing an exception

¿Que pasa?

Editar: la respuesta ha sido sugerida para usar:

NSLog (@"%@", print_block());

Pero eso tampoco funciona. El programa termina al comienzo de la definición del bloque, y la consola dice solo (lldb) y Xcode poniendo una pequeña flecha verde en la definición del bloque. La flecha dice:

Thread 1: EXC_BAD_ACCESS (code=1, address=0x5f646e71)

He intentado algo más que no funciona:

NSString *(^print_block) () = ^ (NSString *returned_string){
    NSString *return_me = @"this block worked!";
    return return_me;  
};

NSLog(@"%@", print_block);

Pero al menos esto no termina el programa. Funciona bien. Pero la salida de la consola sigue siendo incorrecta:

<__NSGlobalBlock__: 0x5a58>

preguntado el 27 de julio de 12 a las 17:07

prueba NSLog(@"%@", print_block()); -

no funciona Sin embargo, no recibo la gran cantidad de mensajes de error, lo que parece un progreso. Pero el código termina sin ejecutarse. Alternativamente, probé: ` NSString *(^print_block) () = ^ (NSString *returned_string){ ` NSString *return_me = @"¡este bloque funcionó!";` ` return return_me; ` ` };` `` ` NSLog(@"%@", print_block);` Ahora, esto no me da ningún error en absoluto, pero todavía no funciona bien. La salida de la consola debe ser this block worked! pero en cambio es <__NSGlobalBlock__: 0x5a58>. -

Lo siento por el formato, no puedo hacer que este mini-Markdown funcione bien, aunque creo que estoy haciendo lo que dice. Puse ` alrededor de todas las partes del código, pero solo las del final salieron con el formato correcto. Y no puedo por mi vida hacer una nueva línea. La ayuda dice que agregue dos espacios seguidos para hacer una nueva línea. Dos espacios parecen no hacer nada en absoluto. De todos modos, lo siento. -

Cuatro espacios al comienzo de una línea la convierten en una línea de 'código'. Dos espacios y una nueva línea hacen una nueva línea. -

@LeMotJuiced El código en su pregunta no me da una gran avalancha de errores. solo imprime <__NSGlobalBlock__: 0x100002430>, como se esperaba. Creo que no cortó y pegó su código real que no funciona en su pregunta. -

1 Respuestas

El comentario de Vatev tiene razón. Cuando escribes:

NSLog(@"%@", print_block);

estás pasando el bloque print_block como argumento para la cadena de formato en la instrucción de registro. Estás tratando de imprimir el bloque. Esto probablemente resulte en [print_block description] siendo llamado. No sé si los bloques implementan un -description método, pero si no, obtendrá una excepción de selector no reconocida.

Además, la forma en que ha declarado el bloque es incorrecta. No necesita incluir el valor devuelto en la lista de parámetros.

El siguiente código funciona como esperas:

NSString *(^print_block)() = ^{
    return @"this block worked!";  
};

NSLog(@"%@", print_block());

Respondido 27 Jul 12, 17:07

Cortaré y pegaré mi respuesta a Vatev: no funciona. Sin embargo, no recibo la gran cantidad de mensajes de error, lo que parece un progreso. Pero el código termina sin ejecutarse. Alternativamente, probé: ` NSString *(^print_block) () = ^ (NSString *returned_string){ ` NSString *return_me = @"¡este bloque funcionó!";` ` return return_me; ` ` };` `` ` NSLog(@"%@", print_block);` Ahora, esto no me da ningún error en absoluto, pero todavía no funciona bien. La salida de la consola debe ser this block worked! pero en cambio es <__NSGlobalBlock__: 0x5a58>. - Jugo Le Mot

Y cortaré y pegaré mi disculpa por el formato: lo siento por el formato, no puedo hacer que este mini-Markdown funcione bien, aunque creo que estoy haciendo lo que dice. Puse ` alrededor de todas las partes del código, pero solo las del final salieron con el formato correcto. Y no puedo por mi vida hacer una nueva línea. La ayuda dice que agregue dos espacios seguidos para hacer una nueva línea. Dos espacios parecen no hacer nada en absoluto. De todos modos, lo siento de nuevo. - Jugo Le Mot

No funcionó de la forma en que lo escribiste porque especificaste que el bloque toma un parámetro llamado return_string. Vea mi edición para el código que funciona bien. - Caleb

¡Sí! ¡Gracias! Pensé que estaba especificando el valor de retorno. ¡Muchas gracias! - Jugo Le Mot

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.