Iphone: сбой приложения из-за старого encodeObject после обновления - PullRequest
0 голосов
/ 02 августа 2010

В настоящее время мое приложение для 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 ]

1 голос
/ 11 августа 2010

В вашем initWithCoder вы можете просто вызвать containsValueForKey , чтобы увидеть, существует ли ключ, прежде чем пытаться вызвать decodeObjectForKey

0 голосов
/ 11 августа 2010

Я пытался использовать 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];
    }  
...