objective-c - 在 32 位和 64 位上编码/解码 CGFloat

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

我正在将一个应用程序转换为在 64 位上运行。 Apple 文档声明 CGFloat 类型在 32 位上是一个 float,在 64 位上是一个 double

如果是这样,您如何处理值的编码/解码?例如,如果从 CGFloat 创建一个 NSNumber,我应该使用 -numberWithFloat: 还是 -numberWithDouble: NSNumber的方法?同样的问题适用于 NSCoderNSKeyedArchiver 方法 -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/

相关文章:

ios - 使用动态菜单数据的 MF 侧菜单问题

objective-c - 如何在 Cocoa 中实现加密的点对点聊天?

objective-c - 在 objc_SetAssociatedObject 中使用非 id 指针作为值是否可以?

types - 参数化子集

Scala:解决 "illegal cyclic reference"

ios - 关闭键盘不工作

objective-c - 在 objective-c 中定义常量

objective-c - 如何将制表符空间添加到 UILabel.text

Cocoa - 枚举可变数组,删除对象

objective-c - 与@encode相反