我正在将一个应用程序转换为在 64 位上运行。 Apple 文档声明 CGFloat
类型在 32 位上是一个 float
,在 64 位上是一个 double
。
如果是这样,您如何处理值的编码/解码?例如,如果从 CGFloat
创建一个 NSNumber
,我应该使用 -numberWithFloat:
还是 -numberWithDouble:
NSNumber的方法?同样的问题适用于 NSCoder
和 NSKeyedArchiver
方法 -encodeFloat:forKey:
和 -encodeDouble:forKey:
。
我是否必须编写条件宏以便在 32 位上调用 -numberWithFloat:
并在 64 位上调用 -numberWithDouble:
?
如果运行 64 位版本应用程序的用户保存了一个文件,其中这些值被编码为 double 值,并且该文件在 32 位系统上打开/取消存档,会发生什么情况?
我的应用程序中所有使用 CGFloats
的方法都不太可能需要 double
的精度级别,所以我应该为此担心吗?
最佳答案
What happens if a user running the 64-bit version of the app saves a file where these values are encoded as doubles and the file is opened/unarchived on a 32-bit system?
没什么特别的。该文件包含一个 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
。
关于objective-c - 在 32 位和 64 位上编码/解码 CGFloat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1746388/