在32-对64位上编码/解码CGFloat

时间:2009-11-17 03:23:53

标签: objective-c cocoa types 32bit-64bit

我正在将应用转换为64位工作。 Apple文档声明CGFloat类型在32位上为float,在64位上为double

如果是这样,你如何处理值的编码/解码?例如,如果从NSNumber创建CGFloat,我应该使用NSNumber的-numberWithFloat:-numberWithDouble:方法吗?相同的问题适用于NSCoderNSKeyedArchiver方法-encodeFloat:forKey:-encodeDouble:forKey:

我是否必须编写一个条件宏,以便在32位上调用-numberWithFloat:而在64位上调用-numberWithDouble:

如果运行64位版本应用程序的用户保存一个文件,其中这些值被编码为双精度并且文件在32位系统上打开/取消归档,会发生什么?

我的应用中使用CGFloats的所有方法都不太可能需要double的精确等级,所以我是否应该担心这个?

1 个答案:

答案 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