【问题标题】:Why can't I seem to unarchive objects in an iPhone app that were archived by an OS X app?为什么我似乎无法解压缩 iPhone 应用程序中由 OS X 应用程序归档的对象?
【发布时间】:2009-07-05 15:29:20
【问题描述】:

我正在编写一个主要以网格模式为中心的 iPhone 应用程序,因此我有一个 Pattern 类,其中包含 NSMutableArrays 的 NSMutableArray。这个类实现了 NSCoding,看起来下面的代码在我的 iPhone 应用中运行良好:

GridPattern * pattern = [GridPattern patternWithWidth:8 height:8];
[pattern setValueAtColumn:0 row:7 value:1];
[NSKeyedArchiver archiveRootObject:pattern toFile:@"test.pat"];
pattern = [NSKeyedUnarchiver unarchiveObjectWithFile:@"test.pat"];

如果我调试上面的代码,在跳过第 4 行之后,我发现我有一个 GridPattern 对象,该对象为第 0 列第 7 行设置了适当的值。

我还编写了一个 Cocoa OSX 应用程序,用于为 iPhone 应用程序创建模式,它也使用相同的 GridPattern 类。它还可以成功加载和保存模式。

我想做的是:

  • 在 OS X 应用程序中创建和保存模式

    1. 将模式文件添加到 XCode for iPhone 应用程序的资源组中; (我添加为test.pat
    2. 取消归档我的 iPhone 应用程序中的模式,使用以下代码:

    pattern = [NSKeyedUnarchiver unarchiveObjectWithFile:@"test.pat"];

但是,当我尝试从该文件中取消归档对象时,返回的只是nil。我以为我可能是文件路径错误,也尝试了@"Resources/test.pat",但无济于事。

我只是错误地引用了文件吗?还是归档对象根本不是跨平台的?这整个方法是完全错误的吗?如果是这样,你会怎么做?

【问题讨论】:

    标签: iphone objective-c cocoa cocoa-touch


    【解决方案1】:

    我不知道跨平台归档的兼容性,但是要引用捆绑资源,您应该始终使用 NSBundle 来查找它。不要依赖当前路径。

    【讨论】:

    • 谢谢,查克!你击中了要害。因此,对于那些好奇的人来说,归档对象似乎确实可以跨平台工作。我使用了以下有效的代码:pattern = [NSKeyedUnarchiver unarchiveObjectWithFile:[[NSBundle mainBundle] pathForResource:@"test" ofType:@"pat"]];
    【解决方案2】:

    由于您的模型只是一个数组数组,因此您可以使用跨架构工作的 XML 属性列表。

    【讨论】:

    • 我在我的一个应用程序中正是这样做的(在 OS X 上保存属性列表并在 iPhone 上读取它们)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多