当我尝试将对象添加到已检索的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
答案 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
。