2010-08-02 4 views
0

В настоящее время мое приложение Iphone еще не выпущено. Когда я работал с симулятором/устройством, и я изменяю свое приложение, чтобы добавить дополнительный кеш в encodeWithCode: и initWithCoder:. Проблема в том, что когда приложение загружается, я пытался использовать часть закодированного объекта, который ранее не был. Например:Iphone: сбой приложения из-за старого encodeObject после обновления

В версии предыдущего приложения (например, 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.

В симуляторе или тестировании я могу просто удалить старую версию и установить ее из свежих. Однако я боюсь, что когда он будет выпущен, я не могу сказать, что мой пользователь удалит старое приложение и установит новый новый. Кто-нибудь испытал эту проблему?

ответ

1

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

+0

Итак, если он не содержит и вам действительно нужен этот атрибут, вы возвращаете нуль ?. Я пытаюсь вернуть нуль в этом случае, но он по-прежнему сбой – vodkhang

+0

, а containsValueForKey не может проверить на случай: я кодирую объект, но decodeInt позже – vodkhang

+0

другой случай, с которым я хочу иметь дело, заключается в следующем: у меня есть стек навигации, VC A -> VC B -> VC C. Если VC C не работает с initWithCoder, я все же хочу инициализировать VC A и VC B, чтобы пользователю не нужно было начинать с начала снова – vodkhang

0

Я попытался использовать try catch, чтобы получить исключение. Это может быть не лучший ответ, но он работает сейчас . Проблема заключается в том, что он может иметь низкую производительность, когда он должен делать исключение попытки поймать, который Яблоко

не рекомендуется
if (archive) { 
     @try { 
      [self unarchiveInitializingWithData:archive]; 
     } 
     @catch (NSException * e) { 
      NCLog (@"Cannot unarchive"); 
      [self normalInitializing]; 
     } 
    } else { 
     NCLog (@"Normal init"); 
     // normal init 
     [self normalInitializing]; 
    } 
Смежные вопросы