Iphone:更新后因旧的encodeObject而导致应用程序崩溃

时间:2010-08-02 03:51:41

标签: iphone objective-c encode

目前,我的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。

在模拟器或测试中,我可以删除旧版本并从新安装。但是,我担心当它发布时,我无法告诉我的用户删除旧的应用程序并安装新的应用程序。有没有人经历过这个问题?

2 个答案:

答案 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];
    }