我正在将应用转换为64位工作。 Apple文档声明CGFloat
类型在32位上为float
,在64位上为double
。
如果是这样,你如何处理值的编码/解码?例如,如果从NSNumber
创建CGFloat
,我应该使用NSNumber的-numberWithFloat:
或-numberWithDouble:
方法吗?相同的问题适用于NSCoder
和NSKeyedArchiver
方法-encodeFloat:forKey:
和-encodeDouble:forKey:
。
我是否必须编写一个条件宏,以便在32位上调用-numberWithFloat:
而在64位上调用-numberWithDouble:
?
如果运行64位版本应用程序的用户保存一个文件,其中这些值被编码为双精度并且文件在32位系统上打开/取消归档,会发生什么?
我的应用中使用CGFloats
的所有方法都不太可能需要double
的精确等级,所以我是否应该担心这个?
答案 0 :(得分:12)
如果运行64位版本应用程序的用户保存一个文件,其中这些值被编码为双精度并且文件在32位系统上打开/取消归档,会发生什么?
没什么特别的。该文件包含double
,并且您可能正在发送decodeDouble:forKey:
来检索该值,因此您将获得double
。然后你可以将它转换为CGFloat
- 如果你在32位机器上,这将失去精确度,但你迟早要做这个演员。 (即使你抓住double
,当你将值传递给Quartz / AppKit / UIKit时,你仍然需要强制转换为CGFloat
。)
考虑替代方法:将float
存储在64位计算机上的文件中,然后将该文件重新加载到同一台计算机上。您和Quartz可以处理64位double
类型的完整精度,但是您没有它,因为您在写出文件时将它丢弃了。如果演员表中的值发生了变化,那么这个变化现在是永久性的。
所以我的建议是始终将double
类型与NSKeyedArchiver一起使用,除非您知道从不将使用float
以外的任何内容(即目标API)仅使用float
,而不是double
)。 Quartz不是这样,因此CGFloat
使用double
。