2011-09-13 43 views
0

我有一個「MainClass」類。該類實現NSCoding協議。在那個類中,我有一個數組與另一個類「對象」的對象,它也實現NSCoding協議。當我存檔在NSUserDefaults的的「MainClass」的對象,然後取消存檔,並嘗試從陣列得到類「對象」的對象,並用它的屬性然後我得到消息:使用來自nsuserdefaults的數據時,應用程序崩潰

[NSConcreteMutableData性質]:無法識別選擇發送到實例。

我該怎麼做?如何解決它?

編輯: 這是我的代碼與使用NSUserDefaults的:

- (Settings *) readData 
{ 
    NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults]; 
    NSData *dataRepresentingSettings = [currentDefaults objectForKey:@"data"]; 

    if (dataRepresentingSettings != nil) { 
      return (MainClass *)[NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSettings]; 
    } 

    return nil; 
} 

- (void) saveData 
{ 
    [[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:self] forKey:@"data"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 
+2

任何機會,你可以添加代碼保存/加載/使用nsuserdefaults?看起來你錯誤地調用了一個函數,但很難說出哪一個,哪個沒有代碼。 –

+0

請在您訪問'NSUserDefaults'的地方發佈相關代碼。 –

回答

1

有兩種選擇:

(1)你不保留您從用戶defualts了對象。當你從NSUserDefaults得到一個對象時,它會自動釋放 - 如果你想保留它,你必須retain它。

(2)您忘記解除存檔。你以前NSKeyedArchiver歸檔你的對象,但並沒有解除封存:)

你可能做過類似

Object *object = [defaults objectForKey:@"object"]; 

,而不是

NSData *data = [defaults objectForKey:@"object"]; 
Object *object = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 

NB不要忘記,在我的object例子仍然是autoreleased;如果你想保留它,你必須保留它;)

相關問題