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)
块是一个函数指针和一些上下文,因此在该级别上,想要使用普通函数指针作为具有空上下文的块似乎是合理的.可能吗?
块是一个函数指针和一些上下文,因此在该级别上,想要使用普通函数指针作为具有空上下文的块似乎是合理的.可能吗?
但问题是,块不是一个函数指针和一些上下文.
块在编译期间捕获可执行代码并在执行期间捕获状态.可执行代码在传递参数方面遵循C ABI,但与方法调用一样,它有一些非常具体的要求.将它转换为C函数声明,返回a BOOL并接受单个int参数的块将如下所示:
BOOL blockLikeFunc(void *block, int arg) { ... }
Run Code Online (Sandbox Code Playgroud)
也就是说,块的"函数"的第一个参数必须是指向块本身的指针.
因此,不,你不能只是撕掉块的"函数"指针并将其转换为C函数或从C函数转换它.
| 归档时间: |
|
| 查看次数: |
2397 次 |
| 最近记录: |