Was bedeutet diese caret ^ Syntax, mit Leere auf beiden Seiten bedeuten? [Duplikat]
-
29-09-2019 - |
Frage
Diese Frage bereits eine Antwort hier:
iPhone SDK 4.0, UIApplication
hat eine neue Methode, setKeepAliveTimeout:
, die einen zweiten Parameter des Typs void(^)(void)
erfordert.
-(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 sie passieren kann?
FWIW Folgendes ist nicht das, was es sucht ...
void SomeHandler( void )
{
}
Lösung
Es ist ein "Block", eine neue Apple-Funktion C in Snow Leopard hinzugefügt. Viele weitere Informationen finden Sie unter:
Blockobjekte
Block-Objekte (informell, „Blöcke“) sind eine Erweiterung zu C sowie Objective-C und C ++, dass es einfach für Programmierer zu definieren, in sich geschlossene Einheiten der Arbeit. Die Blöcke sind ähnlich - aber viel mächtiger als - traditionelle Funktionszeiger. Die wichtigsten Unterschiede sind:
Blöcke können inline definiert werden, als „anonyme Funktionen.“ Blöcke Erfassung schreibgeschützte Kopien von lokalen Variablen, ähnlich wie bei „Schließungen“ in anderen Sprachen Dies ist eine Art von Funktionalität ist in dynamisch typisierten Sprachen interpretiert gemeinsam hat, aber noch nie in C-Programmierer allgemein verfügbar gewesen. Apple veröffentlicht hat sowohl die Blöcke Sprachen Spezifikation und unsere Implementierung als Open Source unter der MIT-Lizenz, hinzugefügt Blöcke unterstützen zu GCC 4.2 und Klirren, und hat es sich zur Prüfung als Teil der nächsten Version der Programmiersprache C geschrieben.
Syntax
Ein Blockvariable sieht aus wie ein Funktionszeiger, außer mit einem Caret ( ‚^‘) anstelle von einem Stern ( ‚*‘).
void (^my_block)(void);
Andere Tipps
Und der Code für diese bestimmte Funktion würde in etwa so aussehen:
[[UIApplication sharedApplication] setKeepAliveTimeout:5.0 handler:^{
NSLog( @"This is my timeout handler" );
}];
Es bedeutet, dass es einen Block nehmen (der Code, auch bekannt als Verschluss) finden Sie unter http : //developer.apple.com/mac/articles/cocoa/introblocksgcd.html Das sind neue zu Objective-C für OSX 10.6 und iOS 4
können Funktionen maskiert werden wie folgt.
#if NS_BLOCKS_AVAILABLE
- (void)foo;
#endif