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,请问这样不会不释放指针的内存空间?