如何直接调用dispatch_block_t?

时间:2015-02-14 03:36:18

标签: objective-c macos automatic-ref-counting grand-central-dispatch

我正在尝试为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。就此而言,我被困住了。

问题:

  1. 现在有办法直接致电__bridge吗?我在一些较旧的博客文章中找到了原始代码模式,因此我怀疑它是(常见的)。
  2. 这是dispatch_retain正确的方法吗?似乎有其他与OS_OBJECT_USE_OBJC和朋友相关的选项可能是合适的。
  3. 我觉得我在这里错过了一个基本概念,这很可能是因为我对OSX开发缺乏经验。
  4. 对于奖励积分:如何在不停用{{1}}的情况下实现此工作?

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_tvoid *相同。您是否自己输入了dispatch_block_t而不是Foundation/Foundation.hdispatch/dispatch.h?您最好在代码中搜索dispatch_block_t typedef。