向检索到的NSMutableArray添加新对象 - 返回NSInternalInconsistencyException

时间:2014-03-01 11:08:53

标签: ios objective-c nsmutablearray

当我尝试将对象添加到已检索的NSMutableArray时,我一直收到此错误。

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

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分:1)

用户默认值返回不可变对象,因此您需要在每个对象上调用mutableCopy,然后才能修改它们。

当您将变量定义为NSMutableArray *时,您有责任确保您存储的实例具有正确的类型。编译器只会告诉你,如果可以告诉你错了。在这种情况下,当您从用户默认值请求“此密钥存在的任何对象类型”时,该方法返回id