在Objective-C中使用块而不是函数是否有优势?

cod*_*der 5 iphone objective-c ios objective-c-blocks

我知道一个块是Objective-C中可重用的可执行代码块.有没有理由我不应该在函数中放入相同的代码块,并在需要运行代码时调用函数?

And*_*sen 14

这取决于你想要完成的事情.关于块的一个很酷的事情是它们捕获局部范围.您可以使用函数实现相同的最终结果,但最终必须执行诸如传递充满相关值的上下文对象之类的操作.使用块,您可以执行以下操作:

int num1 = 42;
void (^myBlock)(void) = ^{
    NSLog(@"num1 is %d", num1);
};

num1 = 0; // Changed after block is created

// Sometime later, in a different scope

myBlock();              // num1 is 42
Run Code Online (Sandbox Code Playgroud)

因此,只需使用变量num1,就可以捕获myBlock定义时的值.

来自Apple的文档:

块是传统回调函数的有用替代方法,主要有两个原因:

  1. 它们允许您在稍后在方法实现的上下文中执行的调用点编写代码.因此,块通常是框架方法的参数.

  2. 它们允许访问局部变量.您只需直接访问本地变量,而不是使用需要数据结构的回调来体现执行操作所需的所有上下文信息.