2009-11-17 152 views
9

我轉換一個應用程序以64位的工作進行解碼CGFloat的。蘋果文檔狀態下CGFloat類型是32位的一個float和在64位一double編碼/在32位和64位

如果是這樣,你如何處理價值的編碼/解碼?舉例來說,如果從CGFloat創建NSNumber,我應該使用的NSNumber的-numberWithFloat:-numberWithDouble:方法?同樣的問題適用於NSCoderNSKeyedArchiver方法-encodeFloat:forKey:-encodeDouble:forKey:

是否必須編寫條件宏,以便在32位上調用-numberWithFloat:,在64位上調用-numberWithDouble:

如果運行的應用程序的64位版本的用戶保存這些值在那裏被編碼爲雙打文件和文件打開/未歸檔的32位系統上會發生什麼?

所有在我的應用程序,使用CGFloats不可能永遠方法需要double的精度水平,所以我應該甚至擔心這個?

回答

12

如果運行64位版本應用程序的用戶保存文件,將這些值編碼爲雙精度並將文件在32位系統上打開/取消保存,會發生什麼情況?

沒什麼特別的。該文件包含一個double,並且可能您正在發送decodeDouble:forKey:以檢索該值,因此您將得到一個double。然後你可以將它投射到CGFloat--如果你在32位機器上會失去精度,但遲早你必須這樣做。 (即使你不放double,你還有當你通過價值石英/ AppKit的/ UIKit的強制轉換爲CGFloat。)

考慮替代方案:您存儲在文件中float S於一64然後將該文件重新加載到同一臺機器上。您和Quartz可以處理64位double類型的全部精度,但您沒有它,因爲您在寫出文件時將其扔掉了。如果劇組中的值完全改變,那麼該改變現在是永久的。

所以我的建議是始終使用double類型與的NSKeyedArchiver,除非你知道你是永遠打算使用任何東西,但float(即目標API只使用float,從來沒有double)。這不適用於Quartz,因此對於CGFloat,請使用double

+0

非常感謝,這說明了很多東西。 – 2009-11-17 22:05:02