是否可以直接将函数指针作为块参数传递?

gla*_*erl 6 objective-c objective-c-blocks

假设我有一个需要块的函数:

void foo(Foo (^block)(Bar));
Run Code Online (Sandbox Code Playgroud)

并说我有一个具有相同签名的函数,除了不是块:

Foo myFunction(Bar);
Run Code Online (Sandbox Code Playgroud)

我可以做这个:

foo(^(Bar bar) { return myFunction(bar); });
Run Code Online (Sandbox Code Playgroud)

但我宁愿这样做,如果有效,这将是相同的:

foo(&myFunction);
Run Code Online (Sandbox Code Playgroud)

如果我尝试,XCode说:

No matching function for call to 'foo'
Run Code Online (Sandbox Code Playgroud)

块是一个函数指针和一些上下文,因此在该级别上,想要使用普通函数指针作为具有空上下文的块似乎是合理的.可能吗?

bbu*_*bum 9

块是一个函数指针和一些上下文,因此在该级别上,想要使用普通函数指针作为具有空上下文的块似乎是合理的.可能吗?

但问题是,块不是一个函数指针和一些上下文.

块在编译期间捕获可执行代码并在执行期间捕获状态.可执行代码在传递参数方面遵循C ABI,但与方法调用一样,它有一些非常具体的要求.将它转换为C函数声明,返回a BOOL并接受单个int参数的块将如下所示:

BOOL blockLikeFunc(void *block, int arg) { ... }
Run Code Online (Sandbox Code Playgroud)

也就是说,块的"函数"的第一个参数必须是指向块本身的指针.

因此,不,你不能只是撕掉块的"函数"指针并将其转换为C函数或从C函数转换它.