我正在尝试使用新的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编译器时,最重要的事情是什么?
答案 0 :(得分:11)
这是因为您正在使用编译器的ARC模式(自动引用计数)。为了成功静态跟踪跨越免费桥梁(从基础到Cocoa,反之亦然)的对象的引用计数,您需要告诉它您已经考虑过这种情况。通常,要么禁用ARC,要么读取The ARC documentation about casts以选择适当的解决方案。
但是,这里有一个更大的问题。 CGColorRef
(UIColorInstance.CGColor
的类型)不免费桥接到Cocoa类型,因此无法安全地转换为id
。为什么不直接存储UIColor
?