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