2014-03-01 38 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,因为您正在从用户默认值请求“此键的任何对象类型”。