【问题标题】:Easy way to archive interlinked objects归档互连对象的简单方法
【发布时间】:2009-07-06 03:39:49
【问题描述】:

在游戏中,我有一堆对象和对象集合,其中一些包含对其他对象的引用。有没有一种直接的方法来存档它们——保存游戏状态——同时保持这些引用?如果我理解得很好,NSArchiver 可以做到这一点,但它在 SDK 2 上不可用,是在 SDK 3 上吗?

(我之前曾问过这个问题(best way to save/load iphone game data),但 SDK 3 已经发布,我想知道这个话题是否有进展。)

【问题讨论】:

    标签: iphone cocoa


    【解决方案1】:

    您需要使所有要序列化的类都实现 NSCoding 协议。之后,您需要使用 NSKeyedArchiver 类对它们进行编码。该类将递归序列化您的对象,并将处理循环。 NSKeyedArchiver 在 iPhone SDK 的所有版本中都可用。要解码您的对象,您将使用 NSKeyedUnarchiver。

    【讨论】:

    • 它会维护对象之间的引用吗?假设一个集合中的一个对象有一个指向另一个集合中另一个对象的指针,那么在对象被解码后那个指针还会在那里吗?
    • 是的,它处理多个引用和循环。您只需要确保所有对象都实现了 NSCoding 协议的 initWithCoder: 和 encodeWithCoder:。在 Cocoa 中最常用的地方是 NIB 文件。 Interface Builder 将您的 Interface 创建为 AppKit 类的实例,然后使用 NSCoder 归档它们。
    • 它就像一个魅力。由于对我类似问题的回答,我被误导了几个月。感谢您澄清这一点,这是一个真正的生活改变者,也是一个教训,不要相信任何有声望的人在 stackoverflow 上说的任何话。 :)
    【解决方案2】:

    在此处查看对象序列化:

    Encoding/Decoding Objects (apple.com)

    基本上,您必须使您的类符合键值编码,才能正确保存所有数据;它将它们归档到二进制属性列表中。在编写完 initWithCoder: 和 encodeWithCoder: 函数后,它几乎是自动的!

    【讨论】:

    • Key-Value Coding 和 NSCoding 是两个独立的概念。
    猜你喜欢
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多