为什么将浮点参数传递给 [UIColor getRed:green:blue:alpha] 会导致崩溃:"EXC_BAD_ACCESS"?



代码示例(iOS 8模拟器和Xcode6):

-(void)viewDidLoad{
    [super viewDidLoad];
    UIColor *color = [UIColor whiteColor];
    float a,b,c;
    [color getRed:&a green:&b blue:&c alpha:nil];//Incompatible pointer types sending 'float *' to parameter of type 'CGFloat *' (aka 'double *')
}

我知道CGFloat在64位设备上被定义为double,但这怎么会导致崩溃?

UIColor方法将尝试向参数指向的内存写入一个double。该内存被声明为float而不是CGFloat(即double)。不确定64位机器上浮点的大小,但我的猜测是浮点小于两倍。因此,该方法(getRed:green:blue:alpha)正在写入不属于您(或应用程序)的内存,因此访问不正确

此外,由于此方法需要指针(C概念),因此不应传递nil,而应传递NULL。尽管从编译器的角度来看,它们都是相同的,但当您传递正确的类型时,您的意图和理解会更加清晰。

您正在调用未定义的行为。任何事情都有可能发生,包括车祸。或者一个永远不会发生在你的机器上的崩溃,但每次苹果审查你的应用程序时。或者每次付费客户使用您的应用程序时。

您最好检查您关闭了哪些警告,这些警告允许编译器编译此代码,然后重新打开它们或将它们转化为错误。

最新更新