在NSUserDefaults保存的NSMutableArray中插入对象

JAA*_*JAA 17 iphone nsuserdefaults nsmutablearray

我有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];
}
Run Code Online (Sandbox Code Playgroud)

这是怎么回事?如果用户调用此方法两次,则第二次应用程序崩溃时会显示以下日志:

*由于未捕获的异常'NSInternalInconsistencyException'终止应用程序,原因:' - [__ NSCFArray insertObject:atIndex:]:发送到immutable对象的mutating方法'

为什么?为什么只是第二次?第一次工作正常!

lxt*_*lxt 35

NSUserDefaults始终返回不可变对象,即使原始对象是可变的.它在以下文档中objectForKey:

返回的对象是不可变的,即使您最初设置的值是可变的.

在修改之前,您需要使用创建返回对象的副本 [NSMutableArray arrayWithArray:]

如果您正在检索数组,也可能最好使用该arrayForKey方法NSUserDefaults.文档:https://developer.apple.com/documentation/foundation/userdefaults

  • @JJSaccolo:你可以采用的一个捷径是`NSMutableArray*bbb = [abc mutableCopy];`. (6认同)

Zor*_*ayr 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];
}
Run Code Online (Sandbox Code Playgroud)

首先,我们在可变数组中读取存储的数据,更新数组,保存新数组,然后同步用户默认值以永久记录更改.

希望这可以帮助!