objective-c - 是否可以直接将函数指针作为 block 参数传递?

标签 objective-c objective-c-blocks

假设我有一个函数需要一个 block :

void foo(Foo (^block)(Bar));

假设我有一个具有相同签名的函数,除了不是 block :

Foo myFunction(Bar);

我能做到:

foo(^(Bar bar) { return myFunction(bar); });

但我宁愿这样做,如果可行的话,这将是等效的:

foo(&myFunction);

如果我尝试这样做,XCode 会说:

No matching function for call to 'foo'

一个 block 是一个函数指针和一些上下文,所以在这个层面上,想要使用一个普通的函数指针作为一个具有空上下文的 block 似乎是合理的。可能吗?

最佳答案

A block is a function pointer together with some context, so on that level it seems reasonable to want to use a plain function pointer as a block with an empty context. Is it possible?

但是,问题在于 block 不是带有某些上下文的函数指针

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

BOOL blockLikeFunc(void *block, int arg) { ... }

也就是说, block “函数”的第一个参数必须是指向 block 本身的指针。

因此,不,您不能只是撕掉 block 的“函数”指针并将其转换为 C 函数或从 C 函数转换。

关于objective-c - 是否可以直接将函数指针作为 block 参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13233402/

相关文章:

objective-c - 已删除 NSManagedObject 从 TableView 中正确删除,然后在保存时重新出现

ios - 如何从 block 中成功分配变量?

iphone - 点击时如何让 UIButton 执行我的类方法?

iphone - 什么会导致 iphone 应用程序未报告的崩溃?

objective-c - didActivateAudioSession 很少不被调用

ios - iOS Objective-C阻止警告:控件到达非空函数的末尾

objective-c - 关于iOS目标版本和SDK版本

objective-c - 无效的转换说明符 '+'

ios - 将变量添加到 block

objective-c - 如何在像 NSDictionary 类的 enumerateObjectsUsingBlock 这样的 block 上使用停止条件?