代码:
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上的颜色......我不需要这样做。这里发生了什么,有办法解决这个问题吗?
答案 0 :(得分:4)
差异可能是因为在32位上,CGFloat
是float
,而在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位的不同精度水平而被恢复时。