2010-08-17 1 views
9

In iPhone SDK 4.0, UIApplication ha un nuovo metodo, setKeepAliveTimeout: che richiede un secondo parametro di tipo void(^)(void).Che cosa significa questa sintassi di accento circonflesso, con vuoto su entrambi i lati?

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

Che cosa fa esattamente la sintassi del secondo parametro medio, e come avrei dichiarare una funzione/gestore che posso passare in esso?

FWIW seguenti non è ciò che sta cercando ...

void SomeHandler(void) 
{ 
} 

risposta

23

Si tratta di un "blocco", una nuova funzionalità Apple ha aggiunto alla C in Snow Leopard. Molte altre informazioni disponibili su:

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

Block Oggetti

oggetti Block (informalmente, “blocchi”) sono un'estensione C, così come Objective-C e C++, che lo rendono facile per i programmatori definire unità di lavoro autonome. I blocchi sono simili a - ma molto più potenti dei - puntatori di funzioni tradizionali. Le differenze principali sono:

I blocchi possono essere definiti in linea, come blocchi catturare lettura solo copie delle variabili locali, simili a “chiusure” in altre lingue Questo è tipo di funzionalità è comune in modo dinamico “funzioni anonime.” linguaggi interpretati a mano, ma non è mai stato ampiamente disponibile per i programmatori C. Apple ha pubblicato sia la specifica Blocks Languages ​​che la nostra implementazione come open source con la licenza MIT, aggiunto il supporto per blocchi a GCC 4.2 e clang, e l'ha sottoposta all'esame come parte della prossima versione del linguaggio di programmazione C.

Sintassi

variabile Un blocco appare come un puntatore alla funzione, se non con un cursore (‘^’) invece di un asterisco (‘*’).

void (^my_block)(void); 
8

E il codice per la funzione specifica sarebbe qualcosa di simile:

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

funzioni possono essere mascherati come segue.

#if NS_BLOCKS_AVAILABLE 
- (void)foo; 
#endif