【问题标题】:implicit conversion of an Objective-C pointer to 'void *' is disallowed with ARCARC 不允许将 Objective-C 指针隐式转换为“void *”
【发布时间】:2011-10-15 15:17:51
【问题描述】:

这是什么意思,我有什么选择?

ARC 不允许将 Objective-C 指针隐式转换为“void *”

我正在将一个 Xcode3 项目移植到 iOS5,它像这样使用 AudioSessionInitialize

AudioSessionInitialize(NULL, NULL, NULL, self);

self 这里是一个 ViewController。

【问题讨论】:

    标签: objective-c core-audio automatic-ref-counting


    【解决方案1】:

    您不能再对void* 进行隐式强制转换,AudioSessionInitialize(NULL, NULL, NULL, objc_unretainedPointer(self)); 应该可以解决问题。

    编辑: 历史点,上面的答案是在__bridge 演员最终确定之前。在现代代码中,正确的答案是由@KazukiSakamoto,AudioSessionInitialize(NULL, NULL, NULL, (__bridge void*)self);提供的

    【讨论】:

      【解决方案2】:

      你应该使用 __bridge cast。

      AudioSessionInitialize(NULL, NULL, NULL, (__bridge void *)self);
      

      【讨论】:

      • 您或@Joshua Weinberg 能否评论您是否需要桥接演员或@Joshua Weinberg 的回答 (objc_unretainedPointer) 是否正确? ARC 编译器喜欢建议__bridge
      • objc_unretainedPointer 是“__attribute__((cf_returns_not_retained)) const void *objc_unretainedPointer(id object) {return object;}”。这些都具有相同的效果,但是,至少 __bridge 是有据可查的,而 objc_unretainedPointer 是无证的。
      • 谢谢@Kazuki Sakamoto,这是我第二次回到这个答案,你的评论真的很有帮助。
      • 这是正确答案,我相信我在添加 __bridge 演员表之前回答了。
      猜你喜欢
      • 2012-01-04
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多