gpt4 book ai didi

iphone - 从 NSCoder 解码对象时,最好的中止方法是什么?

转载 作者:搜寻专家 更新时间:2023-10-30 19:48:28 25 4
gpt4 key购买 nike

我正在从缓存的序列化中解码自定义对象。我已经对该对象进行了版本化++,因为它被编码了,如果序列化版本是旧版本,我想把它扔掉。我的印象是我可以从我的 initWithCoder: 方法中返回 nil,一切都会好起来的。但这会引发错误。

编辑 - 根据 NSObject 的 +version:文档“版本号适用于 NSArchiver/NSUnarchiver,但不适用于 NSKeyedArchiver/NSKeyedUnarchiver。键控归档器不对类版本号进行编码。”。我使用的是键控存档器,因此该方法无济于事。

我使用的是我自己的嵌入式版本号,而不是 NSObject 版本 + NSCoder 的 versionForClassName:。这是解决这个问题的方法吗?如果类版本不匹配,NSCoder 是否会自动中止尝试解码,或者我是否需要手动进行此检查。

我目前正在这样做:

- (id)initWithCoder:(NSCoder *)coder {
if (![coder containsValueForKey:@"Class.User.version"]) {
// Version information missing
self = nil;
return nil;
}

NSInteger modelVersion = [coder decodeIntForKey:@"Class.User.version"];
if (modelVersion < USER_MODEL_VERSION) {
// Old user model, discard
self = nil;
return nil;
}

...
}

我在尝试解码旧版本时遇到此错误

-[__NSPlaceholderDictionary initWithObjects:forKeys:]: number of objects (0) not equal to number of keys (46)'

这一切看起来很奇怪,因为初始化器可能由于多种原因而失败,而在这种情况下模式是返回 nil,所以这真的会导致解码器崩溃吗?

编辑 - 根据 Apple's documentation听起来我正在以正确的方式接近这个。然而,似乎没有一种机制可以在对象陈旧且过时时完全中止解码。我没有或不想要旧对象的升级路径,那我该怎么办?

最佳答案

不是将 self 设置为 nil,而是将您解码的所有单独属性设置为 nil,然后返回 self。所以,这样写:

if (modelVersion < USER_MODEL_VERSION) {
// Old user model, discard
object1 = nil;
object2 = nil;
...
object46 = nil;
}
return self;

这实际上将返回一个正确类型的对象,但所有属性都将为 nil

关于iphone - 从 NSCoder 解码对象时,最好的中止方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6631806/

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