来自docs:
int (^Multiply)(int, int) = ^(int num1, int num2) {
return num1 * num2;
};
int result = Multiply(7, 4); // result is 28
它看起来很复杂 - 可以用函数完成同样的事情吗?这个例子中的真正意义是什么?
答案 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”这两个参数由其他线程共享。它们不会被其他线程修改,因为它们处于“闭包”状态,所以你不需要锁定它,它会保持代码简单。