archivedDataWithRootObject:在32位应用程序上,unarchiveObjectWithData:在64位应用程序上

时间:2014-12-12 11:23:08

标签: ios 64-bit 32bit-64bit

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

在64位应用上对此32位数据执行unarchiveObjectWithData:时是否会出现任何问题?

我在64-Bit Transition Guide

中找到了Apple的这些评论
  
      
  • 修复因数据类型大小更改而导致的对齐问题。
  •   
  • 确保32位和64位运行时共享的内存结构共享相似的布局。
  •   

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

1 个答案:

答案 0 :(得分:1)

通常不会,使用在64位和32位之间切换的存档时应该没有问题。如果存在这是一个无法从您的角度修复的主要问题,因为应该更改存档系统。

问题出现的地方可能是NSIntegerCGFloat这样的原语在这两种情况下具有不同的大小(对于一些非常非常愚蠢的原因)。归档程序应该在数据中添加原语的大小,据我所知。然后,unarchiver可以解释实际的原语并执行正确的赋值,如果需要,将进行类型转换。

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

这些评论应该与此无关,这些问题在复制缓冲区时会出现问题:

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);

然后再次出现问题,如果你使用这个Apple定义的原语将一些原始数据写入某个文件,使用NSData或原始数据本身你根本不知道缓冲区中的内容是什么有一个很大的问题。因此,如果你这样做,你永远不应该使用这些原始定义,而是创建自己的或使用纯C原语。