我正在尝试为XCode 6.1 / Yosemite更新some code。它有点奇怪,因为它是一个宏,但基本上它看起来像:
dispatch_block_t blk = ^{ [[self globalEventsHandler] someMethod self]; };
if([NSThread isMainThread]) blk();
else dispatch_async(dispatch_get_main_queue(), blk);
这会导致编译问题。我已经在预处理器设置中为OS_OBJECT_USE_OBJC=0
设置了Implicit conversion of block pointer type 'void (^)(void)' to C pointer type 'dispatch_block_t' (aka 'void *') requires a bridged cast
,因为我现在对代码的现代化并不感兴趣。
第一个是dispatch_block_t blk = (__bridge dispatch_block_t)^{ [[self globalEventsHandler] someMethod self]; };
if([NSThread isMainThread]) blk();
else dispatch_async(dispatch_get_main_queue(), blk);
。我可以接受建议修复此问题并获取:
Called object type 'dispatch_block_t' (aka 'void *') is not a function or function pointer
但现在我收到一个新错误:dispatch_block_t
。就此而言,我被困住了。
问题:
__bridge
吗?我在一些较旧的博客文章中找到了原始代码模式,因此我怀疑它是(常见的)。dispatch_retain
正确的方法吗?似乎有其他与OS_OBJECT_USE_OBJC
和朋友相关的选项可能是合适的。对于奖励积分:如何在不停用{{1}}的情况下实现此工作?
答案 0 :(得分:6)
对于Xcode 6.1和OS X SDK 10.10,该代码片段完全没问题。但是,这些编译错误消息是奇怪的。
Implicit conversion of block pointer type 'void (^)(void)' to C pointer type 'dispatch_block_t' (aka 'void *') requires a bridged cast
Called object type 'dispatch_block_t' (aka 'void *') is not a function or function pointer.
dispatch_block_t
应该是dispatch/object.h
中的以下内容。
typedef void (^dispatch_block_t)(void);
但是这些错误消息说dispatch_block_t
与void *
相同。您是否自己输入了dispatch_block_t
而不是Foundation/Foundation.h
或dispatch/dispatch.h
?您最好在代码中搜索dispatch_block_t
typedef。