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

时间:2011-12-27 17:30:29

标签: iphone objective-c ios objective-c-blocks

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

2 个答案:

答案 0 :(得分: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

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

来自Apple的documentation

  

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

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

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

  4.   

答案 1 :(得分:4)

正如Brad Larson对this answer回复的评论:

  

块将允许您定义响应的响应   事件,但不是你写一个单独的方法或功能,   它们允许您在设置的位置编写处理代码   该事件的倾听者。这可以节省一大堆代码并使你的   应用程序更有条理。

我能给你的一个很好的例子是警报视图,如果我在创建警报视图时决定当我解雇时会发生什么,而不是我编写委托方法并等待调用。因此,理解和实施起来会更容易,而且它也能提供快速处理。