【问题标题】:LLVM 3.0 compiler error: cast of C pointer type to Objective-C pointer type 'id' requires a bridged castLLVM 3.0 编译器错误:将 C 指针类型转换为 Objective-C 指针类型“id”需要桥接转换
【发布时间】:2011-07-24 17:16:08
【问题描述】:

我正在尝试使用新的 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 编译器时要学习的最重要的事情是什么?

【问题讨论】:

    标签: iphone compiler-construction casting compiler-errors llvm


    【解决方案1】:

    这是因为您使用的是编译器的 ARC 模式(自动引用计数)。要使 ARC 成功静态跟踪通过免费桥梁(Foundation 到 Cocoa,反之亦然)的对象的引用计数,您需要告诉它您已经考虑过这种情况。一般来说,要么禁用 ARC,要么阅读The ARC documentation about casts 来选择合适的解决方案。

    但是,这里有一个更大的问题。 CGColorRefUIColorInstance.CGColor 的类型)不是免费桥接到 Cocoa 类型,因此不能安全地转换为 id。为什么不只存储UIColor

    【讨论】:

    • 是的,你是对的。这不是编译器问题。在新的 Xcode 4.2 版本中,ARC 选项默认设置为 YES。将其设置回 NO 后,现在一切正常。谢谢。
    • 请注意,事情可能正常 - 你正在将实际上只是一个原始结构指针投射到运行时期望为 NSObject 的东西。这是痛苦的秘诀!
    • 代码来自高级 iPhone 开发播客示例之一,因此在特定情况下似乎是可以接受的。
    • 不要相信您在互联网上阅读的所有内容。我在各种播客、书籍和网站中发现了一些非常糟糕的示例代码。这是痛苦的秘诀;如果您想分析原因,请将其发布在单独的问题中。
    猜你喜欢
    • 2021-09-20
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 2020-11-17
    相关资源
    最近更新 更多