4

我正在浏览 Apple 的文档,我看到了类似这样的内容(void (^)(void))。有人能解释一下这句话是什么意思吗?^是异或,对吧?void XOR void对我来说没有多大意义?

还有类似的东西(void (^)(BOOL finished))

4

2 回答 2

14

这些是向 Objective-C 添加匿名函数和函数对象的块。参见例如Introducing Blocks 和 Grand Central Dispatch

块对象(非正式地,“块”)是对 C 以及 Objective-C 和 C++ 的扩展,使程序员可以轻松定义自包含的工作单元。块类似于——但比传统的函数指针更强大。主要区别在于:

  • 块可以内联定义为“匿名函数”。
  • 块捕获局部变量的只读副本,类似于其他语言中的“闭包”

声明一个块变量:

void (^my_block)(void);

为其分配一个块对象:

my_block = ^(void){ printf("hello world\n"); };

调用它:

my_block(); // prints “hello world\n”

接受一个块作为参数:

- (void)doSomething:(void (^)(void))block;

将该方法与内联块一起使用:

[obj doSomeThing:^(void){ printf("block was called"); }];
于 2010-06-20T14:47:42.143 回答
1

这是一个block,一个 Apple 特定的 C 扩展,类似于函数指针或其他语言中的函数对象。

(void (^)(void))看起来像是对不带参数且不返回任何内容的块类型的类型转换。类似地,(void (^)(BOOL finished))看起来像另一种类型转换,对于具有一个布尔参数且不返回任何内容的块。

于 2010-06-20T14:47:44.537 回答