以下是有问题的代码
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
类型已成为没有方法的类吗?
答案 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]];