我使用此代码检查NSMutableArray中是否存在任何对象 如果是的话,我将它们全部删除但它崩溃了,尽管有对象为什么?
if([NSMutableArray1 count]==1)
{
[poemoptionslist removeAllObjects];
}
if ([NSMutableArray1 count]==0)
{
[poemoptionslist addObject: final1];
}
CONSOLE OUTPUT
2010-10-18 03:42:13.166 app1 [33398:207] *终止应用 由于未被捕获的例外 'NSInternalInconsistencyException', 理由:' - [__ NSCFArray removeObjectAtIndex:]:mutating方法 发送到不可变对象' * 在第一次投掷时调用堆栈:(0 CoreFoundation
0x02e55b99 exceptionPreprocess + 185 1 libobjc.A.dylib
0x02fa540e objc_exception_throw + 47 2 CoreFoundation
0x02e0e238 + [NSException raise:format:arguments:] + 136 3
的CoreFoundation
0x02e0e1aa + [NSException 提升:格式:] + 58 4
的CoreFoundation
0x02e4d3c1 - [__ NSCFArray removeObjectAtIndex:] + 193 5
的CoreFoundation
0x02dfe973 - [NSMutableArray removeAllObjects] + 83 6
poemsoflove
0x0004dc8d - [submitpoem submitpoem:] + 18560 7 UIKit
0x003b77f8 - [UIApplication sendAction:to:from:forEvent:] + 119 8 UIKit的
0x00442de0 - [UIControl sendAction:to:forEvent:] + 67 9
UIKit的
0x00445262 - [UIControl(内部) _sendActionsForEvents:withEvent:] + 527 10 UIKit
0x00443e0f - [UIControl touchesEnded:withEvent:] + 458 11 UIKit的
0x003db3d0 - [UIWindow _sendTouchesForEvent:] + 567 12 UIKit
0x003bccb4 - [UIApplication sendEvent:] + 447 13 UIKit 0x003c19bf _UIApplicationHandleEvent + 7672 14图形服务
0x033e6822 PurpleEventCallback + 1550 15 CoreFoundation
0x02e36ff4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION + 52 16 CoreFoundation 0x02d97807 __CFRunLoopDoSource1 + 215 17 CoreFoundation
0x02d94a93 __CFRunLoopRun + 979 18 的CoreFoundation
0x02d94350 CFRunLoopRunSpecific + 208 19 CoreFoundation
0x02d94271 CFRunLoopRunInMode + 97 20 GraphicsServices
0x033e500c GSEventRunModal + 217 21 GraphicsServices
0x033e50d1 GSEventRun + 115 22 UIKit 0x003c5af2 UIApplicationMain + 1160 23首诗歌 0x00002728主+ 102 24 poemsoflove 0x000026b9开始+ 53 25 ??? 0x00000001 0x0 + 1)终止被调用 投掷一个实例后 'NSException'计划收到信号: “SIGABRT”。
伙计们没有NSArray!
我保存到这样的NSUSerdefaults:
if([mutable1 count] == 0) { [mutable1 addObject:final1]; }
NSUserDefaults *list =[NSUserDefaults standardUserDefaults];
[list setObject:mutable1 forKey:@"favorites"];
[list synchronize];
我加载这样的数据
NSUserDefaults *prefs1 =[NSUserDefaults standardUserDefaults];
if ( [prefs1 objectForKey:@"favorites"] != nil)
{
mutable1 = [[NSMutableArray alloc] init];
mutable1 = [prefs1 objectForKey:@"favorites"];
我得到了对象!然后当它运行removeallobjects时它会崩溃!
答案 0 :(得分:7)
mutable1 = [[NSMutableArray alloc] init];
mutable1 = [prefs1 objectForKey:@"favorites"];
即使您已将mutable1声明为NSMutableArray,也要将其重新分配给NSUserDefaults对象返回的对象。这个对象显然是NSArray而不是NSMutableArray,因此崩溃。
您可以通过执行以下操作来加载NSMutableArray和preferences数组:
mutable1 = [[NSMutableArray alloc] init];
[mutable1 addObjectsFromArray:[prefs1 objectForKey:@"favorites"]];
答案 1 :(得分:1)
错误消息表明您正在将消息发送到不可变数组,这会引发异常。未捕获的例外会导致程序终止。
你是如何创建阵列的?导致这种情况的最常见错误是执行以下操作:
[mutableArray copy]
即使你要复制的东西是可变的,副本也是不可变的。在随机选择的示例中,使用mutableCopy insted。
答案 2 :(得分:0)
某处您已将NSMutableArray1设置为NSArray的实例,而不是NSMutableArray,或者您将NSMutableArray1声明为NSArray类型与NSMutableArray类型的属性。
此外,您应该遵循Cocoa / Objective-C命名约定。即,类名以大写字母开头;变量的形式为myArray1(或者更具描述性的形式,最好是)。