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

Posted

技术标签:

【中文标题】使用 NSMutableArray 将变异方法发送到不可变对象【英文标题】:Mutating method sent to immutable object with NSMutableArray 【发布时间】:2015-03-17 06:08:04 【问题描述】:

我发现错误Terminating app due to unaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFArray insertObject:atIndex:]: mutating method sent to immutable object' 当我将对象添加到可变对象时第二次数组第一次添加成功,但第二次它崩溃了应用程序我认为当我将对象添加到数组时有问题。 下面的代码是崩溃的。

- (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 替换为更新的数组,所以我认为没有问题。我没有找到导致崩溃的适当原因。

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

谢谢。

【问题讨论】:

defaults 已经有一些数据了吗?是字典吗? 不,它是一个 NSUserDefaults,现在我解决了这个问题,但最终不明白为什么会这样,如果你发现了,而不仅仅是告诉我我在湖边做什么。 如何将数据复制到 arrGroups 是可变数组还是不可变数组? 也许你应该使用 mutableCopy 方法。 感谢您的帮助。 【参考方案1】:

分配给 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 将变异方法发送到不可变对象的主要内容,如果未能解决你的问题,请参考以下文章

发送到不可变对象的变异方法 - iOS [重复]

使用可变数组函数时,将变异方法发送到不可变对象错误

发送到不可变对象的变异方法

使用 userInfo (null) 发送到不可变对象的变异方法

尽管对象是 NSMutableDictionary,但“发送到不可变对象的变异方法”

发送到不可变对象的变异方法