objective-c - block 声明语法列表

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/

相关文章:

ios - 如何向 UIView 添加触摸事件?

iphone - 开发一个 iPhone 应用程序需要多少钱?

ios - Objective-C 中的字符串替换

objective-c - iOS7 无法隐藏状态栏

ios - UIActivityViewController 在 iOS 8 iPad 上崩溃

ios - 退出 iPhone 应用程序的正确方法?

ios - 如何在 NSUserDefaults 中存储自定义对象

ios - cocoa touch : How To Change UIView's Border

objective-c - #pragma 标记的意义​​是什么?为什么我们需要#pragma 标记

ios - 为什么当应用程序从后台返回时不会调用 viewWillAppear?