簡體   English   中英

為什么這些代碼在64位版本上表現不同? (iOS / UIColor / UIKeyedArchiver)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM