LLVM 3.0编译器错误:将C指针类型强制转换为Objective-C指针类型'id'需要桥接强制转换

时间:2011-07-24 17:16:09

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

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

1 个答案:

答案 0 :(得分:11)

这是因为您正在使用编译器的ARC模式(自动引用计数)。为了成功静态跟踪跨越免费桥梁(从基础到Cocoa,反之亦然)的对象的引用计数,您需要告诉它您已经考虑过这种情况。通常,要么禁用ARC,要么读取The ARC documentation about casts以选择适当的解决方案。

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