2010-08-17 22 views
9

En iPhone SDK 4.0, UIApplication tiene un nuevo método, setKeepAliveTimeout: que requiere un segundo parámetro del tipo void(^)(void).¿Qué significa esta sintaxis^carente, con vacío en ambos lados?

-(BOOL)setKeepAliveTimeout:(NSTimeInterval)timeout handler:(void(^)(void))keepAliveHandler 

¿Qué significa exactamente la sintaxis del segundo parámetro, y cómo iba a declarar una función/controlador que me puede pasar en ella?

Fwiw los siguientes no es lo que está buscando ...

void SomeHandler(void) 
{ 
} 

Respuesta

23

Es un "bloque", una nueva característica de Apple añadió a C en Snow Leopard. Mucho más información disponible en:

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Blocks/Articles/00_Introduction.html

Objetos de bloques

Objetos de bloques (de manera informal, “bloques”) son una extensión de C, así como Objective-C y C++, que lo hacen fácil para los programadores definir unidades de trabajo independientes. Los bloques son similares a, pero mucho más poderosos que, los punteros de función tradicionales. Las principales diferencias son:

bloques se pueden definir en línea, como Bloques capturar copias de sólo lectura de las variables locales, similares a los “cierres” en otros idiomas Este es tipo de funcionalidad es común en forma dinámica “funciones anónimas.” -tipo de idiomas interpretados, pero nunca antes había estado ampliamente disponible para los programadores de C. Apple ha publicado tanto la especificación de idiomas Blocks como nuestra implementación como fuente abierta bajo la licencia MIT, agregó soporte de bloques a GCC 4.2 y clang, y la ha sometido a consideración como parte de la próxima versión del lenguaje de programación C.

Sintaxis

variable de un bloque se ve como un puntero de función, excepto con un acento circunflejo (‘^’) en lugar de un asterisco (‘*’).

void (^my_block)(void); 
8

y el código para esa función en particular lo haría mira algo como:

[[UIApplication sharedApplication] setKeepAliveTimeout:5.0 handler:^{ 
    NSLog(@"This is my timeout handler"); 
}]; 
0

Las funciones se pueden enmascarar de la siguiente manera.

#if NS_BLOCKS_AVAILABLE 
- (void)foo; 
#endif 
Cuestiones relacionadas