2010-08-02 89 views
0

目前,我的Iphone應用程序尚未發佈。當我使用模擬器/設備時,我修改了我的應用程序以將更多緩存添加到encodeWithCode:initWithCoder:。問題是,當應用程序加載時,我試圖使用一些以前不存在的編碼對象。例如:Iphone:更新後因舊的encodeObject導致應用程序崩潰

在以前的應用程序版本(如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; 
} 

然後應用程序會因爲找不到myArray2而崩潰。

在模擬器或測試中,我可以刪除舊版本並從新安裝。但是,我擔心,當它被釋放時,我不能告訴我的用戶刪除舊的應用程序並安裝新的應用程序。有沒有人遇到過這個問題?

回答

1

在你的initWithCoder你應該能夠只是調用containsValueForKey,看看是否鑰匙試之前存在調用decodeObjectForKey

+0

因此,如果它不包含,並且您確實需要該屬性,則返回nil ?.我試圖在這種情況下返回零,但它仍然崩潰 – vodkhang 2010-08-11 09:30:15

+0

和containsValueForKey無法檢查的情況下:我編碼的對象,但decodeInt後來 – vodkhang 2010-08-11 09:38:34

+0

另一種情況下,我想處理的是:我有一個導航堆棧,VC A - > VC B - > VC C.如果VC C沒有initWithCoder,我仍然想要初始化VC A和VC B,這樣用戶不必再從頭開始 – vodkhang 2010-08-11 09:45:35

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]; 
    } 
相關問題