[英]Why does this code behave differently on 64 bit builds? (iOS / UIColor / UIKeyedArchiver)
編碼:
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上的顏色......我不需要這樣做。 這里發生了什么,是否有辦法解決這個問題?
差異可能是因為在32位上, CGFloat
是一個float
而在64位下它是一個double
float
。
嘗試使用double
而不是CGFloat
。 或者只是接受64位以下的事實,您將獲得更高的精度值。
通過Apple技術支持事件確認這是與arm64上的歸檔類相關的錯誤。 他們的建議是建立一個自定義歸檔程序類。
這不再是一個問題(或者從來不是一個問題)。
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
但是 ,使用未選擇arm64
HSBA值構建UIColor
對象,將其歸檔,然后在arm64
下取消歸檔將導致在恢復時因不同的64位精度水平而導致不同的HSBA值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.