gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 03:28:47 27 4
gpt4 key购买 nike

我正在将一个应用程序转换为在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com