目前,我的Iphone应用尚未发布。当我使用模拟器/设备时,我修改了我的应用程序,以便在encodeWithCode:
和initWithCoder:
中添加更多缓存。问题是,当加载应用程序时,我尝试使用之前不存在的一些编码对象。例如:
在之前的应用程序版本(例如1.2)中,我有这个编码:
- (void)encodeWithCoder:(NSCoder*)coder {
[coder encodeObject:myArray forKey:NCITEMTABLE_ARCHIVE_HOME_ITEMS_KEY];
}
但是对于新版本(例如1.3),我使用这个init:
- (id)initWithCoder:(NSCoder*)coder {
if (self = [super initWithCoder:coder]) {
myArray = [[coder decodeObjectForKey:NCITEMTABLE_ARCHIVE_HOME_ITEMS_KEY] retain];
myArray2 = [[coder decodeObjectForKey:NCITEMTABLE_ARCHIVE_HOME_ITEMS_2_KEY] retain];
}
return self;
}
然后应用程序将崩溃,因为它无法找到myArray2。
在模拟器或测试中,我可以删除旧版本并从新安装。但是,我担心当它发布时,我无法告诉我的用户删除旧的应用程序并安装新的应用程序。有没有人经历过这个问题?
答案 0 :(得分:1)
在你的initWithCoder中,你应该能够在尝试调用decodeObjectForKey之前调用containsValueForKey以查看密钥是否存在
答案 1 :(得分:0)
我尝试使用try catch来获取异常。它可能不是最好的答案,但它现在有效 。问题是,当它必须执行try catch异常时可能性能较低,这是Apple不推荐的
if (archive) {
@try {
[self unarchiveInitializingWithData:archive];
}
@catch (NSException * e) {
NCLog (@"Cannot unarchive");
[self normalInitializing];
}
} else {
NCLog (@"Normal init");
// normal init
[self normalInitializing];
}