gpt4 book ai didi

objective-c - 如何直接调用dispatch_block_t?

转载 作者:行者123 更新时间:2023-12-02 08:29:40 27 4
gpt4 key购买 nike

我正在尝试更新 some code适用于 XCode 6.1/优胜美地。它有点奇怪,因为它是一个宏,但本质上它看起来像:

dispatch_block_t blk = ^{ [[self globalEventsHandler] someMethod self]; };
if([NSThread isMainThread]) blk();
else dispatch_async(dispatch_get_main_queue(), blk);

这会导致编译问题。我已经根据 GCD guide 设置了 OS_OBJECT_USE_OBJC=0在我的预处理器设置中,因为现在我对代码现代化不感兴趣。

第一个是 block 指针类型“void (^)(void)”到 C 指针类型“dispatch_block_t”(又名“void *”)的隐式转换需要桥接转换。我可以接受对此的建议修复并获得:

dispatch_block_t blk = (__bridge dispatch_block_t)^{ [[self globalEventsHandler] someMethod self]; };
if([NSThread isMainThread]) blk();
else dispatch_async(dispatch_get_main_queue(), blk);

但现在我收到一个新错误:调用的对象类型“dispatch_block_t”(又名“void *”)不是函数或函数指针。我被困住了。

问题:

  1. 现在有办法直接调用dispatch_block_t吗?我在几篇较旧的博文中找到了原始代码模式,因此我怀疑它很常见。
  2. __bridge 是执行此操作的正确方法吗?似乎还有其他与 dispatch_retain 和可能合适的 friend 相关的选项。
  3. 我觉得我在这里遗漏了一个基本概念,这很有可能是因为我对 OSX 开发非常缺乏经验。

对于奖励积分:如何在不禁用 OS_OBJECT_USE_OBJC 的情况下让它工作?

最佳答案

该代码片段完全适用于带有 OS X SDK 10.10 的 Xcode 6.1。然而,这些编译错误信息很奇怪。

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。

关于objective-c - 如何直接调用dispatch_block_t?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28512150/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com