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

Posted

技术标签:

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

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

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

AudioSessionInitialize(NULL, NULL, NULL, self);

self 这里是一个 ViewController。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】: Automatic Reference Counting - 3.2.4. Bridged casts

你应该使用 __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 演员表之前回答了。

以上是关于ARC 不允许将 Objective-C 指针隐式转换为“void *”的主要内容,如果未能解决你的问题,请参考以下文章

arc 不允许隐式转换 'unsigned long 'UIUserNotificationSettings *'

ARC 中不允许从 NSInteger 到 NSString 的隐式转换.. 应该使用啥解决方法来处理整数

Objective-C在ARC下,把strong指针设置为nil,请问这样不会不释放指针的内存空间?

Objective-C中,ARC下的 strong和weak指针原理解释

OC加强之ARC

使用 ARC 将 NSUInteger 转换为字符串 [重复]