objective-c - block 声明语法列表

标签 objective-c syntax objective-c-blocks

Objective C(我猜确实是 C)中的 block 语法是出了名的不协调。将 block 作为参数传递看起来与将 block 声明为 ivars 不同,后者看起来与 typedefing block 不同。

是否有一个完整的 block 声明语法列表可供我快速引用?

最佳答案

block 声明语法列表

从头到尾,让

  • return_type 是 object/primitive/etc 的类型。你想返回(通常是 void)
  • blockName 是你正在创建的 block 的变量名
  • var_type 是类型 object/primitive/etc。您想作为参数传递(留空表示无参数)
  • varName是给定参数的变量名

请记住,您可以创建任意数量的参数。

block 作为变量

可能是最常见的声明。

return_type (^blockName)(var_type) = ^return_type (var_type varName)
{
    // ...
};

block 作为属性

很像将 block 声明为变量,但略有不同。

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

block 作为参数

请注意,这与“作为参数的 block ”不同;在本例中,您声明了一个需要 block 参数的方法。

- (void)yourMethod:(return_type (^)(var_type))blockName;

block 作为参数

请注意,这与“作为参数的 block ”不同;在这种情况下,您正在调用一个需要带有匿名 block 的 block 参数的方法。如果你已经声明了一个 block 变量,将变量名作为参数传递就足够了。

[someObject doSomethingWithBlock: ^return_type (var_type varName)
{
    //...
}];

匿名 block

这在功能上是一个匿名 block ,但是将 block 分配给变量的语法只是将变量设置为等于匿名 block 。

^return_type (var_type varName)
{
    //...
};

typedef block

这允许您设置一个短名称,在声明 block 时可以像任何其他类名一样引用它。

typedef return_type (^blockName)(var_type);

以后要使用 blockName 代替标准 block 声明语法,只需替换即可。

内联 block

这可以说是对方 block 的一种不太有用的利用,但仍然可能有它的位置。内联 block 是在实例化后立即调用的匿名 block 。

^return_type (var_type varName)
{
    //...
}(var);

内联 block 主要用于范围偏移,大致相当于简单的大括号分隔的代码块。

{
   //...
}

递归 block

这允许您从自身调用一个 block ,创建一个可在回调和 GCD 调用期间使用的循环。这种实例化方法在 ARC 中没有保留循环。

__block return_type (^blockName)(var_type) = [^return_type (var_type varName)
{
    if (returnCondition)
    {
        blockName = nil;
        return;
    }

    // ...
} copy];
blockName(varValue);

返回 block

一个方法可以返回一个 block ,

- (return_type(^)(var_type))methodName
{
    // ...
}

一个函数也可以,如果有点奇怪的话。

return_type (^FunctionName())(var_type)
{
    // ...
}

附录

如果我遗漏了什么,请在评论中告诉我,我会研究/添加它们。

哦,在 Swift 中...

blockName = (varName: var_type) -> (return_type)

这几乎就像是一种语言功能。

关于objective-c - block 声明语法列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9201514/

相关文章:

iphone - 我怎样才能知道 iPhone 中当前 View Controller 的名称

ios - 在隐藏状态栏的情况下更改应用程序时自动调整 View

c++ - boost::program_options 具有多个标记的配置文件选项

iphone - 在 Controller 之间传递数据的 "delegates"的替代方案是什么?

amazon-web-services - 使用 AWSTask,如何将 block 声明为变量

ios - 如何在 UITableView 中使用 UITableView 作为 ios Objective-C 中的下拉列表

iphone - AdMob 中介 SDK 不会抛出失败的广告?

c++ - 应该如何阅读此 C++ 语法?

C++:前向声明时指针大小未知(错误 C2036)

objective-c - 任何人都可以在一行中创建 block 和复制时解释这种异常情况吗?