为什么类型转换为id将摆脱此错误消息“类型'CGColorRef'的集合元素'(又名'struct CGColor *')不是Objective-C对象”

时间:2014-02-21 11:29:20

标签: objective-c struct casting

以下是有问题的代码

UIColor *colorOne = [UIColor colorWithRed:(120/255.0) green:(135/255.0) blue:(150/255.0) alpha:1.0];
UIColor *colorTwo = [UIColor colorWithRed:(57/255.0)  green:(79/255.0)  blue:(96/255.0)  alpha:1.0];


CAGradientLayer *gradient = [CAGradientLayer layer];
gradient.frame = self.view.bounds;

gradient.colors = @[ [colorOne CGColor], [colorTwo CGColor] ];  // ERROR

最后一行将产生以下错误消息:

MyController.m:31:26: Collection element of type 'CGColorRef' 
    (aka 'struct CGColor *') is not an Objective-C object

但是,如果我将行更改为

gradient.colors = @[ (id)[colorOne CGColor], (id) [colorTwo CGColor] ];

它使编译器沉默。

为什么将结构类型转换为id有效?是因为我们欺骗编译器相信struct类型已成为没有方法的类吗?

1 个答案:

答案 0 :(得分:4)

记录在"Transitioning to ARC Release Notes"

  

编译器理解返回Core的Objective-C方法   基础类型遵循历史Cocoa命名约定(请参阅   Advanced Memory Management Programming Guide)。例如,   编译器知道,在iOS中,CGColor返回CGColor   UIColor的方法不属于。您仍必须使用合适的类型   演员,如这个例子所示:

NSMutableArray *colors = [NSMutableArray arrayWithObject:(id)[[UIColor darkGrayColor] CGColor]];
[colors addObject:(id)[[UIColor lightGrayColor] CGColor]];