gpt4 book ai didi

ios - archivedDataWithRootObject : on 32 bit app, unarchiveObjectWithData:在 64 位应用程序上

转载 作者:行者123 更新时间:2023-11-29 02:26:41 28 4
gpt4 key购买 nike

我们正在更新我们的应用程序以支持 64 位。当应用程序仍然是 32 位时,我们通过 archivedDataWithRootObject: 在用户默认值和文件系统中保留了一些数据。

在 64 位应用程序上对这个 32 位数据执行 unarchiveObjectWithData: 时会不会有任何问题?

我在 64-Bit Transition Guide 中找到了 Apple 的这些评论:

  • Fix alignment issues caused by changes in data type sizes.
  • Ensure that memory structures that are shared between the 32-bit and 64-bit runtimes share a similar layout.

但是在查看 NSKeyedArchiver 的文档时,它说不合适的数据类型会自动强制转换。

最佳答案

通常不会,使用在 64 位和 32 位之间切换的存档器时应该没有问题。如果存在,那么从您的角度来看,这是一个无法解决的重大问题,因为应该更改存档系统。

可能出现问题的地方是诸如 NSInteger 和 CGFloat 之类的基元,它们在这两种情况下具有不同的大小(很可能出于某些非常非常愚蠢的原因) 。据我所知,归档器应该在数据中添加基元的大小。然后,解档器可以解释实际的原语并执行正确的分配,如果需要的话将进行类型转换。

您可以通过创建一个小型应用程序来轻松测试所有这些,该应用程序执行存档和取消存档并将存档数据保存到计算机上的某个文件中。这样您就可以使用模拟器来测试它是否按预期工作。

这些评论应该与此无关,当执行诸如复制缓冲区之类的操作时,这些问题会成为问题:

NSInteger floatCount = 100; // number of floats in the buffer
CGFloat *buffer1; // has the data
CGFloat *buffer2; // will be copied to

size_t bufferSize = 4*floatCount; // Not safe as we assume a CGFloat has is 32-bit
size_t bufferSize = 4*sizeof(CGFloat); // Safe

buffer2 = malloc(bufferSize);
memcpy(buffer2, buffer1, bufferSize);

如果您使用 NSData 或原始数据本身使用 Apple 定义的原语将一些原始数据写入某个文件,那么您根本无法知道其中的内容,那么就会出现问题缓冲区,你有一个很大的问题。因此,如果您曾经这样做过,则永远不应该使用这些基元定义,而应该创建自己的基元定义或使用纯 C 基元。

关于ios - archivedDataWithRootObject : on 32 bit app, unarchiveObjectWithData:在 64 位应用程序上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27442611/

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