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

Iphone:更新后旧的encodeObject导致应用程序崩溃,iphone,objective-c,encode,Iphone,Objective C,Encode,目前,我的Iphone应用程序尚未发布。当我使用模拟器/设备时,我修改了我的应用程序,将更多缓存添加到encodeWithCode:和initWithCoder:中。问题是,在加载应用程序时,我试图使用一些以前不存在的编码对象。例如: 在以前的应用程序版本(如1.2)中,我有以下编码: - (void)encodeWithCoder:(NSCoder*)coder { [coder encodeObject:myArray forKey:NCITEMTABLE_ARCHIVE_HOME_

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


在模拟器或测试中,我可以删除旧版本并从新版本安装。然而,我担心当它发布时,我不能告诉我的用户删除旧的应用程序并安装新的。有人遇到过这个问题吗?

我尝试使用try-catch获取异常。这也许不是最好的答案,但它现在起作用了 . 问题是,当它必须执行try-catch异常时,它的性能可能很低,这是苹果公司不推荐的

  if (archive) {
        @try {
            [self unarchiveInitializingWithData:archive];
        }
        @catch (NSException * e) {
            NCLog (@"Cannot unarchive");
            [self normalInitializing];
        }
    } else {
        NCLog (@"Normal init");
        // normal init
        [self normalInitializing];
    }  

在initWithCoder中,在尝试调用decodeObjectForKey之前,您应该能够调用以查看密钥是否存在。因此,如果它不包含并且您确实需要该属性,则返回nil?。在这种情况下,我试图返回nil,但它仍然崩溃,containsValueForKey无法检查是否存在这种情况:我编码了一个对象,但后来解码了另一种情况是:我有一个导航堆栈,VC a->VC B->VC C。如果VC C无法使用编码器初始化,我仍然想初始化VC A和VC B,这样用户就不必从头开始了。Containes Value Forkey会让您知道您需要从旧状态“升级”到新状态,只有您能够解决如何执行的细节。(将内容设置为nil或空数组等)