Objective C中的块语法是出了名的不协调。将块作为参数传递与将块声明为ivars不同,后者与对块进行类型定义不同。

是否有一个完整的块声明语法列表,我可以随时保存以供快速参考?


当前回答

typedef void (^OkBtnBlock)(id data);
typedef void (^CancelBtnBlock)();

@property (nonatomic, strong) OkBtnBlock okBtnBlock;
@property (nonatomic, strong) CancelBtnBlock cancelBtnBlock;

+ (void)foo:(OkBtnBlock)okBtn andCancel:(CancelBtnBlock)btnCancel;

其他回答

类型:

typedef void (^block)(NSString *arg);

内联:

void (^block)(NSString *) = ^(NSString *param) {
  // do something....
};

方法:

- (void)method:(void (^)(NSString *param))handler

Xcode 4代码段库包含块类型defs和内联块作为变量的模板。它们也可以通过自动补全(typedefblock和inlineblock)来实现。

对于作为方法参数的块,我建议声明一个类型定义,然后简单地使用它。它使代码更容易阅读。

我为一个类写了一个completionBlock,它将返回一个骰子被摇后的值:

Define typedef with returnType (.h above @interface declaration) typedef void (^CompleteDiceRolling)(NSInteger diceValue); Define a @property for the block (.h) @property (copy, nonatomic) CompleteDiceRolling completeDiceRolling; Define a method with finishBlock (.h) - (void)getDiceValueAfterSpin:(void (^)(NSInteger diceValue))finishBlock; Insert previous defined method in .m file and commit finishBlock to @property defined before - (void)getDiceValueAfterSpin:(void (^)(NSInteger diceValue))finishBlock{ self.completeDiceRolling = finishBlock; } To trigger completionBlock pass predefined variableType to it (Don't forget to check whether the completionBlock exists) if( self.completeDiceRolling ){ self.completeDiceRolling(self.dieValue); }

我个人喜欢使用这个网站(http://fuckingblocksyntax.com)。这个名字比块语法本身更容易记住:

http://fuckingblocksyntax.com

如果你不能加载含有脏话的url,你可以使用这个镜像:http://goshdarnblocksyntax.com

如果你需要回到Xcode 4.2中,你也可以@synthesize一个声明为属性的block,就像你使用非block属性一样。不要让块语法打倒你。

如果你的block属性是:

@property (copy) return_type (^blockName) (var_type);

然后你的@synthesize是这样的:

@property blockName;

欢呼。