objective-c - 是否有针对 Objective-C block 的通用直接可执行类型?

标签 objective-c objective-c-blocks

我想在我的一次性 block 之前摆脱复杂类型声明:

void (^blockHelperA)(NSString*, NSString*) = ^(NSString *foo, NSString *bar) {…};

这可以重写为:

id blockHelperB = ^(NSString *foo, NSString *bar) {…};

哪个看起来更好并且可以编译,但是不能直接执行:

// “Called object type 'id' is not a function or function pointer”
blockHelperB(@"Foo", @"Bar");

然后是dispatch_block_t类型,不过那只是一个简单的简写:

typedef void (^dispatch_block_t)(void);

有没有办法摆脱精确的类型声明,然后仍然以简单的方式执行 block ?我知道我可以做到这一点:

id foo = ^{ return @"bar"; };
dispatch_sync(dispatch_get_current_queue(), foo);

…但这只是将噪声从声明转移到执行。

最佳答案

没有(理智)方法可以做到这一点,因为您受到 C 类型系统的限制。

特别是对于函数指针和 block ,C 不允许您定义“通用”类型。

这方面的一个例子是 dispatch_block_t 类型将用于具有 void 返回类型和零参数的 block 。 其他 block 签名都不起作用。期间。

由于 block 在编译时有效地转换为函数指针(以及其他魔法),因此没有直接类型与它们相关联。对于存储在任何给定 block 引用中的 block 的实际类型,您的里程可能会有很大差异。因此,考虑到这一点,您就可以理解为什么当您尝试将 block 存储在 id 中时编译器无法理解您的意思。

可在此处找到更多相关信息:http://clang.llvm.org/docs/Block-ABI-Apple.html .

抱歉,这只是您必须学会忍受的怪癖之一。

关于objective-c - 是否有针对 Objective-C block 的通用直接可执行类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6055554/

相关文章:

iOS/objective-C : Store Decimal as NSNumber in CoreData

objective-c - 错误 : CONNECTION INTERRUPTED in Xcode running on Device

ios - 这如何防止 block 保留循环?

ios - "Missing __block type specifier"重构代码后编译错误但重构前正常

objective-c - 基于 UIView block 的动画重绘

c++ - 将 C++ 函数包装成 block

iphone - 在以下情况下保存应用程序状态数据的最佳方法是什么?

objective-c - 无法快速创建桥接头

objective-c - 静态字符串->字符串映射

ios - 如何并行执行多个回调方法