在Objective-C中,这个块有多大意义?

时间:2010-09-20 20:40:15

标签: iphone objective-c block

来自docs

int (^Multiply)(int, int) = ^(int num1, int num2) {
    return num1 * num2;
};
int result = Multiply(7, 4); // result is 28

它看起来很复杂 - 可以用函数完成同样的事情吗?这个例子中的真正意义是什么?

4 个答案:

答案 0 :(得分:8)

块的力量就像词汇闭包一样(在Python或C#等语言中也称为lambda)。因此,你可以做到

// within other code

int myVar;

int (^multiplyClosure)(int) = ^(int num1) {
    return num1 * myVar;
};

然后你可以传递这个块,它将保留myVar的(副本)。因此,闭包实际上是代码上下文,其中就是权力。

答案 1 :(得分:4)

在这个特定的例子中,即使是函数也是不合适的,因为它是基本的算术。但是,该示例用于向您展示块的语法和调用约定。

块本身作为回调或“拖放代码”更有用。它们是一种进行委派和代码扩展的方法,无需构建有状态函数或委托类,也无需为每个回调提供无处不在的void *contextInfo参数。

答案 2 :(得分:2)

此示例的目的是向您展示如何创建块以及它们可以执行的操作。这就像几乎每本书中都会找到的“hello world”示例,但不是真正的应用程序。它只是用来说明一个概念。

答案 3 :(得分:1)

块中没有同步问题。考虑到你在多线程中做事,“Multiply”这两个参数由其他线程共享。它们不会被其他线程修改,因为它们处于“闭包”状态,所以你不需要锁定它,它会保持代码简单。