使用NSMutableArray将变量方法发送到不可变对象

时间:2015-03-17 06:08:04

标签: ios objective-c nsmutablearray nsuserdefaults

我发现错误终止应用由于未捕获的异常' NSInternalInconsistencyException',原因:' - [__ NSCFArray insertObject:atIndex:]:发送到不可变对象的变异方法' 当我第二次将对象添加到可变数组第一次成功添加但第二次崩溃应用程序我认为当我添加对象到数组时有问题。 下面的代码是崩溃。

- (void) viewWillAppear:(BOOL)animated
{

    if ([defaults objectForKey:@"Groups"] != nil)
    {
        NSLog(@"not nil defaults.");
        arrGroups = (NSMutableArray *)[defaults objectForKey:@"Groups"];
    }
    else
    {
        NSLog(@"nil defaults.");
        arrGroups = [[NSMutableArray alloc] init];
    }
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

{

NSLog(@"button index == %ld",(long)buttonIndex);
//txtCategory = [[alertView textFieldAtIndex:0] text];

if (buttonIndex == 1)
{
    //[self addingCategory:self];
    NSLog(@"Adding Group name = %@",[[alertView textFieldAtIndex:0]text]);
    [arrGroups addObject:[[alertView textFieldAtIndex:0]text]]; **//Crash here! at the time of add second object or also when i remove first object**
    NSLog(@"Added to array.");
    [defaults setObject:arrGroups forKey:@"Groups"];
    [defaults synchronize];
    //[defaults release];
    [tblGroups reloadData];
}

}

当我删除第一个对象时,我用更新的数组替换userdefault所以我认为没有问题。而且我没有找到造成这次事故的正当理由。

所以请支持我或者理解我的问题或解决方案,但不理解我无法理解的问题,所以请任何人告诉你为什么会这样。

感谢。

1 个答案:

答案 0 :(得分:5)

分配给NSMutableArray的问题是,只有在为defaultDefects分配给定键的NSMutableArray时才会有效。

注意:NSUserDefaults始终返回一个不可变对象。

改为

NSMutableArray *arrGroups = [[defaults objectForKey:@"Groups"]mutableCopy];

这保证了可变副本。

另一种方式是。

arrGroups = [[NSMutableArray alloc]initWithArray:[defaults objectForKey:@"Groups"]]; //in your viewWillAppear where you assign array from defaults.