- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当对象的属性在存档和取消存档过程之间发生变化时,我在使用 NSKeyedArchiver 和 NSKeyedUnarchiver 时遇到了一些麻烦。这是一个具体的例子:
我有一个类,比如说Task
,它有name
和desc
属性,都是NSString<类型
。现在,我使用 NSKeyedArchiver archivedDataWithRootObject
进行存档并将其写入文件。稍后我可以从文件中读取它并使用 NSKeyedUnarchiver unarchiveObjectWithData(data)
立即回到我想去的地方。当 Task
获得一个新属性并且为了让事情变得有趣而失去一个时,问题就来了。
所以现在,Task
有 name
,这是一个 NSString
,但是缺少 desc
。此外,我添加了 NSDate
类型的属性 dateDue
。然后启动模拟器。问题是未归档的是具有旧 desc
属性的旧 Task
而不是新的 dateDue
。
我的 initFromCoder
实际上考虑了当前类中不存在属性并且不尝试对其进行解码的情况。
有没有一种方法可以向 NSCoder 方法解释,不要像我序列化它时那样为我创建对象的精确副本(我意识到这是序列化/反序列化定义的一部分),而是允许我版本的灵 active ?
谢谢
最佳答案
有一种简单的方法——将版本写入数据并将其作为initFromCoder
的开头读取。如果版本比较失败,则从初始化程序返回 nil
。
当你添加一个属性时,即使你试图解码数据,你也只会得到一个 nil
值。您始终可以检查 nil
值。
删除属性时,应该没有任何问题。
请注意,您是同时实现编码和解码的人,因此您可以按照自己的方式实现它。
关于ios - 如何将 NSCoder 与版本化类一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13370123/
我是一名优秀的程序员,十分优秀!