LLVM 3.0 编译器错误:将 C 指针类型转换为 Objective-C 指针类型“id”;需要桥接演员
我正在尝试使用新的 LLVM 3.0 编译器编译旧的 iPhone 应用程序项目。 我收到此错误:
自动引用计数问题:将 C 指针类型“CGColorRef”(又名“struct CGColor *”)转换为 Objective-C 指针类型“id”需要桥接转换 [4]
对于代码:
UIColor *color1, *color2, *color3, *color4;
....
NSArray *colors = [NSArray arrayWithObjects:(id)color1.CGColor, color2.CGColor, color3.CGColor, nil];
此代码在较旧的 LLVM GCC 4.2 编译器中编译没有问题。 其原因何在? 迁移到 LLVM 3.0 编译器时需要学习的最重要的事情是什么?
I am trying to compile old iPhone application project using new LLVM 3.0 compiler.
I am getting this error:
Automatic Reference Counting Issue: cast of C pointer type 'CGColorRef' (aka 'struct CGColor *') to Objective-C pointer type 'id' requires a bridged cast [4]
for code:
UIColor *color1, *color2, *color3, *color4;
....
NSArray *colors = [NSArray arrayWithObjects:(id)color1.CGColor, color2.CGColor, color3.CGColor, nil];
This code compiles without problems in older LLVM GCC 4.2 compiler.
What is the cause of that?
What are the most important things to learn when migrating to the LLVM 3.0 compiler?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这是因为您正在使用编译器的 ARC 模式(自动引用计数)。为了让 ARC 成功地静态跟踪跨越免费桥梁(从 Foundation 到 Cocoa,反之亦然)的对象的引用计数,您需要告诉它您已经考虑了这种情况。一般来说,要么禁用 ARC,要么阅读有关强制转换的 ARC 文档< /a> 选择适当的解决方案。
然而,这里有一个更大的问题。
CGColorRef
(UIColorInstance.CGColor
的类型)不是免费桥接到 Cocoa 类型,因此不能安全地转换为 代码>id。为什么不只存储UIColor
?This is because you're using the compiler's ARC mode (Automatic Reference Counting). For ARC to successfully statically track the reference count of objects that cross the toll-free bridges (Foundation to Cocoa and vice versa), you need to tell it that you've considered the situation. In general, either disable ARC or have a read of The ARC documentation about casts to pick the appropriate solution.
However, here you have a bigger problem.
CGColorRef
(the type ofUIColorInstance.CGColor
) is not toll-free bridged to a Cocoa type, and so cannot be safely cast to aid
. Why not just store theUIColor
?