2010-08-17 7 views
9

In iPhone SDK 4.0 hat UIApplication eine neue Methode, setKeepAliveTimeout:, die einen zweiten Parameter des Typs void(^)(void) erfordert.Was bedeutet diese Caret^-Syntax, mit nichtig auf jeder Seite?

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

Was genau macht die Syntax des zweiten Parameters bedeuten, und wie würde ich eine Funktion/Handler erklären, dass ich in ihn passieren kann?

FWIW folgend ist nicht das, was es sucht ...

void SomeHandler(void) 
{ 
} 

Antwort

23

Es ist ein "Block", ein neues Feature Apple C in Snow Leopard hinzugefügt. Viele weitere Informationen finden Sie unter:

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

Blockobjekte

Block-Objekte (informell, „Blöcke“) sind eine Erweiterung zu C sowie Objective-C und C++, die es Einfach für Programmierer, um in sich abgeschlossene Arbeitseinheiten zu definieren. Blöcke sind ähnlich wie - aber viel mächtiger als traditionelle Funktionszeiger. Die wichtigsten Unterschiede sind:

Blöcke können inline definiert werden, wie Blöcke schreibgeschützt erfassen Kopien von lokalen Variablen, ähnlich wie bei „Schließungen“ in anderen Sprachen Dies ist eine Art von Funktionalität üblich ist in dynamisch „anonyme Funktionen.“ typisierte interpretierte Sprachen, war aber noch nie für C-Programmierer verfügbar. Apple hat sowohl die Spezifikation der Blocksprachen als auch unsere Implementierung als Open Source unter der MIT-Lizenz veröffentlicht, GCC 4.2 und clang als Blockunterstützung hinzugefügt und als Teil der nächsten Version der C-Programmiersprache zur Prüfung eingereicht.

Syntax

Ein Blockvariable sieht aus wie ein Funktionszeiger, außer mit einem Caret (‚^‘) anstelle von einem Stern (‚*‘).

void (^my_block)(void); 
8

und der Code für diese bestimmte Funktion würde etwa wie folgt aussehen:

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

Funktionen können wie folgt maskiert werden.

#if NS_BLOCKS_AVAILABLE 
- (void)foo; 
#endif