2010-07-12 7 views

Antwort

86

Sicher.

+0

Gibt es eine Möglichkeit, einen generischen Typ für einen Block zu haben? Ich hasse es, dass ich dort einen 'typedef' haben muss. –

+3

@Jacob yeah, du kannst: 'void (^) (void)' (oder welche Block-Signatur du benötigst) überall dort, wo du 'MyCustomBlockType' siehst. Ich verspreche jedoch, dass die Verwendung von 'typedef' die Dinge auf lange Sicht viel einfacher machen wird. Es gibt jedoch keine Möglichkeit, "irgendeinen Block mit irgendeinem Rückgabewert und irgendwelchen Parametern zu sagen. Sie müssen bezüglich der Signatur explizit sein. –

+3

@Jacob Sie sind immer noch durch das Typsystem von C eingeschränkt. Es gibt keinen" generischen "Block In C++ können Sie mit Templates und Blöcken einige ziemlich verwirrende Dinge tun. Realistischer ausgedrückt ist Typ id in Bezug auf Objective-C-Typen generisch, also nimmt und gibt (möglicherweise nil) id zurück. s gibt Ihnen eine Menge Flexibilität. –

12

Ja, Sie können sicher einen Verweis auf eine (Kopie) eines Objective-C-Blocks speichern. Die Variablendeklaration ist ein bisschen haarig, wie C-Funktionszeiger, aber darüber hinaus ist es kein Problem. Für einen Block, und id und void zurückgibt nimmt:

typedef void (^MyActionBlockType)(id); 

@interface MyClass : NSObject 
{ 

} 

@property (readwrite,nonatomic,copy) MyActionBlockType myActionBlock; 
@end 

wird der Trick.

+3

Die Definition ist definitiv haarig. Ich * * bevorzuge es, typedef einfach zu verwenden. Dann können Sie wahnsinnige Dinge tun "Blöcke, die einen Block als Parameter akzeptieren und einen Block zurückgeben" und nicht in den Klammern verloren gehen. :) –

+0

Sehr guter Punkt, Dave. –

+0

ist das 'typedef void (^ MyActionBlockType) (id);' korrekt? sollte es nicht sein 'typedef void (^ MyActionBlockType) (id obj);' – SpaceDog