在NSUserDefaults保存的NSMutableArray中插入对象

时间:2011-03-17 23:10:21

标签: iphone nsmutablearray nsuserdefaults

我有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方法'

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

6 个答案:

答案 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];