Ios 使用NSMutableArray发送到不可变对象的变异方法

Ios 使用NSMutableArray发送到不可变对象的变异方法,ios,objective-c,nsmutablearray,nsuserdefaults,Ios,Objective C,Nsmutablearray,Nsuserdefaults,我发现由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序时出现错误,原因:'-[\u nsFarray insertObject:atIndex:]:当我第二次将对象添加到可变数组时发送到不可变对象“的mutating方法第一次添加成功但第二次应用程序崩溃,我认为将对象添加到数组时存在问题。 下面的代码是崩溃 - (void) viewWillAppear:(BOOL)animated { if ([defaults objectForK

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

- (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,所以我认为没有问题。我也没有找到合适的原因

所以请支持我,或者理解我的问题或解决方案,但如果不理解问题,我就无法理解解决方案,所以请任何人告诉我为什么会发生这种情况


谢谢。

分配给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.

分配给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.

默认值是否已经有一些数据?它是字典吗?不,它是一个NSUserDefaults,现在我解决了这个问题,但还没有最终理解为什么会这样,如果你发现了,告诉我我我在做什么。你如何将数据复制到arrGroups?它是可变的还是不可变的数组?可能是你应该使用mutableCopy方法。谢谢你的帮助。默认值已经有一些数据了吗?是字典吗?不,是NSUserDefaults,现在我解决了这个问题,但最终还是不明白为什么会这样,如果你发现了,那么告诉我我在做什么。你如何将数据复制到arrGroups是可变的还是不可变的数组?可能是你应该使用mutableCopy方法。谢谢你的帮助。帮了我很多。帮了我很多