使用 NSMutableArray 发送到不可变对象的变异方法
Mutating method sent to immutable object with NSMutableArray
我发现错误 由于未捕获的异常 'NSInternalInconsistencyException' 而正在终止应用程序,原因:'-[__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,所以我认为没有问题。我没有找到崩溃的正确原因。
所以请支持我理解我的问题或解决方案但不了解问题我无法理解解决方案所以请任何人告诉为什么会发生这种情况。
谢谢。
分配给 NSMutableArray 的问题是,只有当 defaultDefects 被分配给给定键的 NSMutableArray 时它才会起作用。
注意:NSUserDefaults 总是 returns 一个不可变对象。
改为这样做
NSMutableArray *arrGroups = [[defaults objectForKey:@"Groups"]mutableCopy];
这保证了一个可变副本。
另一种方式是。
arrGroups = [[NSMutableArray alloc]initWithArray:[defaults objectForKey:@"Groups"]]; //in your viewWillAppear where you assign array from defaults.
我发现错误 由于未捕获的异常 'NSInternalInconsistencyException' 而正在终止应用程序,原因:'-[__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,所以我认为没有问题。我没有找到崩溃的正确原因。
所以请支持我理解我的问题或解决方案但不了解问题我无法理解解决方案所以请任何人告诉为什么会发生这种情况。
谢谢。
分配给 NSMutableArray 的问题是,只有当 defaultDefects 被分配给给定键的 NSMutableArray 时它才会起作用。
注意:NSUserDefaults 总是 returns 一个不可变对象。
改为这样做
NSMutableArray *arrGroups = [[defaults objectForKey:@"Groups"]mutableCopy];
这保证了一个可变副本。
另一种方式是。
arrGroups = [[NSMutableArray alloc]initWithArray:[defaults objectForKey:@"Groups"]]; //in your viewWillAppear where you assign array from defaults.