为什么这些代码在64位版本上表现不同? (iOS / UIColor / UIKeyedArchiver)

时间:2014-03-11 23:07:48

标签: ios iphone objective-c ipad nscoding

代码:

UIColor * color = [UIColor colorWithHue:0.3 saturation:0.2 brightness:0.2 alpha:1];
CGFloat r,g,b,a;

[color getRed:&r green:&g blue:&b alpha:&a];

NSData * colorData = [NSKeyedArchiver archivedDataWithRootObject:color];
UIColor * unarchivedColor = [NSKeyedUnarchiver unarchiveObjectWithData:colorData];

[unarchivedColor getRed:&r green:&g blue:&b alpha:&a];


正如32位版本所预期的那样,unarchivedColor和color具有完全相同的rgb值。在arm64版本中,unarchivedColor和颜色开始在第9个小数位附近不同。

换句话说,归档/取消归档UIColor会修改arm64上的颜色......我不需要这样做。这里发生了什么,有办法解决这个问题吗?

3 个答案:

答案 0 :(得分:4)

差异可能是因为在32位上,CGFloatfloat,而在64位下则是double

尝试使用double代替CGFloat。或者只是接受64位以下的事实,您将获得更高的精度值。

答案 1 :(得分:4)

通过Apple技术支持事件确认这是与arm64上的归档类有关的错误。他们的建议是建立一个自定义归档程序类。

答案 2 :(得分:0)

这不再是一个问题(或者从来就不是问题)。

UIColor * color = [UIColor colorWithHue:0.3 saturation:0.2 brightness:0.2 alpha:1];
NSData * colorData = [NSKeyedArchiver archivedDataWithRootObject:color];
UIColor * unarchivedColor = [NSKeyedUnarchiver unarchiveObjectWithData:colorData];

CGFloat r, g, b, h, s, a;
[color getHue:&h saturation:&s brightness:&b alpha:&a];
NSLog(@"HSBA %f %f %f %f", h, s, b, a);
[unarchivedColor getHue:&h saturation:&s brightness:&b alpha:&a];
NSLog(@"unarchived HSBA %f %f %f %f", h, s, b, a);

[color getRed:&r green:&r blue:&b alpha:&a];
NSLog(@"RGB %f %f %f %f", r, g, b, a);
[unarchivedColor getRed:&r green:&r blue:&b alpha:&a];
NSLog(@"unarchived RGB %f %f %f %f", r, g, b, a);

结果(格式化)

HSBA            0.300000 0.200000 0.200000 1.000000
unarchived HSBA 0.300000 0.200000 0.200000 1
RGB             0.200000 0.000000 0.160000 1.000000
unarchived RGB  0.200000 0.000000 0.160000 1.000000

但是,使用未选择UIColor的HSBA值构建arm64对象,将其归档,然后在arm64下取消归档将导致不同的HSBA值当它们由于64位的不同精度水平而被恢复时。