Pat*_*ini 276 syntax objective-c objective-c-blocks
目标C中的块语法(实际上是C,我推测)是众所周知的不协调.将块作为参数传递看起来与将块声明为ivars不同,后者看起来与typedef块不同.
是否有一个完整的块声明语法列表,我可以随时查看以供快速参考?
Pat*_*ini 692
自始至终,让
return_type是对象/原语/等的类型.你想回来(通常void)blockName 是您正在创建的块的变量名称var_type是类型对象/原始/等.你想作为一个参数传递(留空没有参数)varName 是给定参数的变量名称请记住,您可以根据需要创建任意数量的参数.
可能是宣言最常见的.
return_type (^blockName)(var_type) = ^return_type (var_type varName)
{
    // ...
};
Run Code Online (Sandbox Code Playgroud)
就像将块声明为变量一样,但却略有不同.
@property (copy) return_type (^blockName) (var_type);
Run Code Online (Sandbox Code Playgroud)
请注意,这与"块作为参数"不同; 在这种情况下,您将声明一个需要块参数的方法.
- (void)yourMethod:(return_type (^)(var_type))blockName;
Run Code Online (Sandbox Code Playgroud)
请注意,这与"作为参数的块"不同; 在这个例子中,您正在调用一个需要带有匿名块的块参数的方法.如果已经声明了块变量,则将变量名称作为参数传递就足够了.
[someObject doSomethingWithBlock: ^return_type (var_type varName)
{
    //...
}];
Run Code Online (Sandbox Code Playgroud)
这在功能上是一个匿名块,但是将块分配给变量的语法只是将变量设置为等于匿名块.
^return_type (var_type varName)
{
    //...
};
Run Code Online (Sandbox Code Playgroud)
typedef 块这允许您设置一个短名称,可以在块声明期间像任何其他类名一样引用.
typedef return_type (^blockName)(var_type);
Run Code Online (Sandbox Code Playgroud)
稍后使用blockName而不是标准块声明语法,只需替换.
这可以说是块的利用率较低,但可能仍然有其地位.内联块是在实例化后立即调用的匿名块.
^return_type (var_type varName)
{
    //...
}(var);
Run Code Online (Sandbox Code Playgroud)
内联块主要用于范围偏移,并且大致相当于简单的大括号分隔代码块.
{
   //...
}
Run Code Online (Sandbox Code Playgroud)
这允许您从自身调用一个块,创建一个可以在回调和GCD调用期间使用的循环.这种实例化方法在ARC中没有保留周期.
__block return_type (^blockName)(var_type) = [^return_type (var_type varName)
{
    if (returnCondition)
    {
        blockName = nil;
        return;
    }
    // ...
} copy];
blockName(varValue);
Run Code Online (Sandbox Code Playgroud)
一个方法可以返回一个块,
- (return_type(^)(var_type))methodName
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)
一个函数,如果有点奇怪.
return_type (^FunctionName())(var_type)
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)
如果我错过了什么,请在评论中告诉我,我会研究/添加它们.
blockName = (varName: var_type) -> (return_type)
Run Code Online (Sandbox Code Playgroud)
它几乎就像是一种语言功能.
psy*_*psy 81
我个人喜欢使用这个网站(http://fuckingblocksyntax.com).该名称比块语法本身更容易记住:
如果您无法在其中加载包含错误字词的网址,则可以使用此镜像:http://goshdarnblocksyntax.com

Eri*_*ner 39
的typedef:
typedef void (^block)(NSString *arg);
Run Code Online (Sandbox Code Playgroud)
排队:
void (^block)(NSString *) = ^(NSString *param) {
  // do something....
};
Run Code Online (Sandbox Code Playgroud)
方法:
- (void)method:(void (^)(NSString *param))handler
Run Code Online (Sandbox Code Playgroud)
        omz*_*omz 16
Xcode 4代码段库包含块typedef和内联块作为变量的模板.它们也可通过自动完成(typedefblock和inlineblock)获得.
对于块作为方法的参数,我建议声明a typedef然后简单地使用它.它使代码更容易阅读.
Ale*_*Cio 11
我为一个类写了一个completionBlock,它将在它们被震动后返回一个骰子的值:
使用returnType定义typedef(.h上面的@interface声明)
typedef void (^CompleteDiceRolling)(NSInteger diceValue);
Run Code Online (Sandbox Code Playgroud)@property为块定义a (.h)
@property (copy, nonatomic) CompleteDiceRolling completeDiceRolling;
Run Code Online (Sandbox Code Playgroud)用finishBlock(.h)定义方法
- (void)getDiceValueAfterSpin:(void (^)(NSInteger diceValue))finishBlock;
Run Code Online (Sandbox Code Playgroud)在.m文件中插入先前定义的方法并提交finishBlock到@property之前定义的
- (void)getDiceValueAfterSpin:(void (^)(NSInteger diceValue))finishBlock{
    self.completeDiceRolling = finishBlock;
}
Run Code Online (Sandbox Code Playgroud)触发completionBlock传递预定义的variableType给它(不要忘记检查是否completionBlock存在)
if( self.completeDiceRolling ){
    self.completeDiceRolling(self.dieValue);
}
Run Code Online (Sandbox Code Playgroud)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;
Run Code Online (Sandbox Code Playgroud)