В настоящее время мое приложение 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.
В симуляторе или тестировании я могу просто удалить старую версию и установить ее из свежих. Однако я боюсь, что когда он будет выпущен, я не могу сказать, что мой пользователь удалит старое приложение и установит новый новый. Кто-нибудь испытал эту проблему?
Итак, если он не содержит и вам действительно нужен этот атрибут, вы возвращаете нуль ?. Я пытаюсь вернуть нуль в этом случае, но он по-прежнему сбой – vodkhang
, а containsValueForKey не может проверить на случай: я кодирую объект, но decodeInt позже – vodkhang
другой случай, с которым я хочу иметь дело, заключается в следующем: у меня есть стек навигации, VC A -> VC B -> VC C. Если VC C не работает с initWithCoder, я все же хочу инициализировать VC A и VC B, чтобы пользователю не нужно было начинать с начала снова – vodkhang