2014-03-01 87 views
5

當我嘗試將對象添加到檢索到的NSMutableArray時,我不斷收到此錯誤。將新對象添加到檢索的NSMutableArray - 返回NSInternalInconsistencyException

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFArray insertObject:atIndex:]: mutating method sent to immutable object' 

檢索:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    NSMutableArray *arrayOfTitles = [userDefaults objectForKey:@"mainArraySaveData"]; 
    NSMutableArray *arrayOfSubjects = [userDefaults objectForKey:@"subjectArraySaveData"]; 
    NSMutableArray *arrayOfDates = [userDefaults objectForKey:@"dateArraySaveData"]; 

    _mutableArray=arrayOfTitles; 
    _subjectArray=arrayOfSubjects; 
    _dateArray=arrayOfDates; 

    [_tableView reloadData]; 

節省:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
_mutableArray = [[NSMutableArray alloc] initWithArray:[userDefaults objectForKey:@"mainArraySaveData"]]; 
[userDefaults setObject:_mutableArray forKey:@"mainArraySaveData"]; 
[userDefaults synchronize]; 

_dateArray = [[NSMutableArray alloc] initWithArray: [userDefaults objectForKey:@"dateArraySaveData"]]; 
[userDefaults setObject:_dateArray forKey:@"dateArraySaveData"]; 
[userDefaults synchronize]; 

_subjectArray = [[NSMutableArray alloc] initWithArray: [userDefaults objectForKey:@"subjectArraySaveData"]]; 
[userDefaults setObject:_subjectArray forKey:@"subjectArraySaveData"]; 
[userDefaults synchronize]; 

我很困惑,我認爲這是旨在返回NSMutableArray,但它說沒有 - NSArray。我的問題是什麼? 謝謝,SebOH

回答

5

我很困惑,因爲我認爲這是設計返回NSMutableArray,但它不說 - NSArray。我的問題是什麼?

有關此問題的NSUserDefaults會談具體的objectForKey:方法的「特殊注意事項」部分中的文檔:

特別注意事項

返回的對象是不可變的,即使你最初設定的值是可變的。

解決這個問題很簡單 - 使用mutableCopy:initWithArray:arrayWithArray:方法,使可變副本:

_mutableArray=[arrayOfTitles mutableCopy];      // You can do this... 
_subjectArray=[NSMutableArray arrayWithArray:arrayOfSubjects]; // ...or this 
_dateArray=[[NSMutableArray alloc] initWithArray:arrayOfDates]; // ...or this. 
+0

謝謝你洙多! –

+0

第一行結束了幫助我的問題,_mutableArray = [arrayOfTitles mutableCopy]; –

1

用戶默認值將返回不可變的對象,因此您需要先調用mutableCopy,然後才能修改它們。

當您將變量定義爲NSMutableArray *時,您有責任確保您在那裏存儲的實例的類型正確。如果可以告訴,編譯器只會告訴你你錯了。在這種情況下,該方法返回id,因爲您正在從用戶默認值請求「此鍵的任何對象類型」。