崩溃了我的应用[NSMutableArray1 removeAllObjects] iphone sdk

时间:2010-10-18 00:46:43

标签: iphone nsmutablearray

我使用此代码检查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时它会崩溃!

3 个答案:

答案 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(或者更具描述性的形式,最好是)。