代码之家  ›  专栏  ›  技术社区  ›  vodkhang

Iphone:应用程序崩溃,因为更新后的旧对象

  •  0
  • vodkhang  · 技术社区  · 15 年前

    目前,我的Iphone应用程序还没有发布。当我使用模拟器/设备时,我修改了我的应用程序,将更多的缓存添加到 encodeWithCode: initWithCoder: . 问题是,在加载应用程序时,我试图使用一些以前不存在的编码对象。例如:

    在以前的应用程序版本(例如1.2)中,我有以下编码:

    - (void)encodeWithCoder:(NSCoder*)coder {
        [coder encodeObject:myArray forKey:NCITEMTABLE_ARCHIVE_HOME_ITEMS_KEY];
    }
    

    但对于新版本(如1.3),我使用以下初始化:

    - (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;
    }
    

    2 回复  |  直到 15 年前
        1
  •  1
  •   superfell    15 年前

    在initWithCoder中,您应该可以直接调用 containsValueForKey 在尝试调用decodeObjectForKey之前查看密钥是否存在

        2
  •  0
  •   vodkhang    15 年前

    我尝试使用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];
        }