我有NSUserDefaults保存的NSMutableArray。 这个数组是我用户可以保存的“最喜欢的”项目,所以当我想添加一个项目时,我需要读取数组(来自NSuserDefault)并保存在第一个空闲位置。
我正在使用此方法在NSMutableArray中添加值
-(IBAction)save{
NSMutableArray *abc = [[NSUserDefaults standardUserDefaults] objectForKey:@"12345"];
int n = [abc count];
[abc insertObject:@"aaa" atIndex:n];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[[NSUserDefaults standardUserDefaults] setObject:abc forKey:@"12345"];
[defaults synchronize];
[abc release];
}
这是什么交易?
如果用户调用此方法两次,则第二次应用程序崩溃时会显示此日志:
* 由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:' - [__ NSCFArray insertObject:atIndex:]:发送到不可变对象的mutating方法'
为什么呢? 为什么只是第二次? 第一次工作正常!
答案 0 :(得分:35)
NSUserDefaults
总是返回不可变对象,即使原始对象是可变的。它位于objectForKey
的文档中:
返回的对象是不可变的,即使您最初设置的值是可变的。
在使用[NSMutableArray arrayWithArray:]
如果您正在检索数组,也可以最好使用arrayForKey
NSUserDefaults
方法。文档:https://developer.apple.com/documentation/foundation/userdefaults
答案 1 :(得分:9)
这是一个完整的工作示例:
- (void)saveScore:(NSNumber *)score
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *scoreList = [[NSMutableArray alloc] initWithArray: [defaults objectForKey:@"ScoreList"]];
[scoreList addObject:score];
[defaults setObject:scoreList forKey:@"ScoreList"];
[defaults synchronize];
}
首先,我们读入可变数组中的存储数据,更新数组,保存新数组,然后同步用户默认值以永久记录更改。
希望这有帮助!
答案 2 :(得分:1)
另一种选择是:
[[NSUserDefaults standardUserDefaults] setObject:[[[NSUserDefaults standardUserDefaults] objectForKey:@"12345"] arrayByAddingObject:object] forKey:@"12345"];
答案 3 :(得分:1)
以这种方式从NSUserDefault
复制数组:
[YourArray addObjectsFromArray:[[NSUserDefaults standardUserDefaults]
objectForKey:@"NSUSD"]];
YourArray = [[NSMutableArray alloc]
initWithArray:[[NSUserDefaults standardUserDefaults]
objectForKey:@"NSUSD"]];
[YourArray addObject: (currentObject)];
答案 4 :(得分:0)
这是因为NSMutablepointer直接指向NSUserDefault对象。您应该首先将NSUserDefault对象复制到一个数组而不是处理它。
NSMutableArray *arr= [NSMutableArray arrayWithObjects:@"asd",@"dsa",nil];
[[NSUserDefaults standardUserDefaults] setObject:arr forKey:@"12345"];
NSMutableArray *abc = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"12345"]];
//[[NSUserDefaults standardUserDefaults] objectForKey:@"12345"];
int n = [abc count];
[abc insertObject:@"aaa" atIndex:n];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[[NSUserDefaults standardUserDefaults] setObject:abc forKey:@"12345"];
[defaults synchronize];
[abc release];
答案 5 :(得分:0)
快速修复:
_retrivedArray = [_mutableArray mutableCopy];