zou*_*oul 13 objective-c objective-c-blocks
我想在我的一次性块之前摆脱复杂的类型声明:
void (^blockHelperA)(NSString*, NSString*) = ^(NSString *foo, NSString *bar) {…};
Run Code Online (Sandbox Code Playgroud)
这可以改写为:
id blockHelperB = ^(NSString *foo, NSString *bar) {…};
Run Code Online (Sandbox Code Playgroud)
哪个看起来更好并且编译,但不能直接执行:
// “Called object type 'id' is not a function or function pointer”
blockHelperB(@"Foo", @"Bar");
Run Code Online (Sandbox Code Playgroud)
然后是一种dispatch_block_t类型,但这只是一个简单的简写:
typedef void (^dispatch_block_t)(void);
Run Code Online (Sandbox Code Playgroud)
有没有办法摆脱精确的类型声明,然后仍然以一种简单的方式执行块?我知道我可以这样做:
id foo = ^{ return @"bar"; };
dispatch_sync(dispatch_get_current_queue(), foo);
Run Code Online (Sandbox Code Playgroud)
......但这只是将声音从声明转移到执行.
Jac*_*kin 14
由于受到C类型系统的限制,没有(理智的)方法可以做到这一点.
特别是对于函数指针和块,C不允许您定义"通用"类型.
这方面的一个例子是该类型dispatch_block_t将只与具有void返回类型和参数零块工作.没有其他块签名可行.期.
由于块在编译时被有效地转换为函数指针(在其他魔术中),因此没有与它们相关联的直接类型.对于您在任何给定块参考中存储的实际块类型,您的里程可能会有很大差异.因此,考虑到这一点,您可以理解当您尝试在块中存储块时编译器无法理解您的原因id.
有关这方面的更多信息,请访问:http://clang.llvm.org/docs/Block-ABI-Apple.html.
对不起,但这只是你必须学会忍受的怪癖之一.
| 归档时间: |
|
| 查看次数: |
1543 次 |
| 最近记录: |