【问题标题】:crashes my app [NSMutableArray1 removeAllObjects] iphone sdk使我的应用程序崩溃 [NSMutableArray1 removeAllObjects] iphone sdk
【发布时间】:2011-04-26 17:44:10
【问题描述】:

我使用此代码检查我的 NSMutableArray 中是否存在任何对象 如果是,我将它们全部删除,但尽管有对象,但它崩溃了,为什么?

    if([NSMutableArray1 count]==1)
    {
        [poemoptionslist removeAllObjects];
    }



    if ([NSMutableArray1 count]==0)
    {
        [poemoptionslist addObject: final1];
    }

控制台输出

2010-10-18 03:42:13.166 app1[33398:207] * 终止应用程序 由于未捕获的异常 'NSInternalInconsistencyException', 原因:'-[__NSCFArray removeObjectAtIndex:]:变异方法 发送到不可变对象' * 首次抛出时调用堆栈:( 0 CoreFoundation
0x02e55b99 异常预处理 + 185 1 libobjc.A.dylib
0x02fa540e objc_exception_throw + 47 2 核心基础
0x02e0e238 +[NSException 提高:格式:参数:] + 136 3
核心基金会
0x02e0e1aa +[NSException 提高:格式:] + 58 4
核心基金会
0x02e4d3c1 -[__NSCFArray removeObjectAtIndex:] + 193 5
核心基金会
0x02dfe973 -[NSMutableArray 删除所有对象] + 83 6
爱的诗
0x0004dc8d -[submitpoem submitpoem:] + 18560 7 UIKit
0x003b77f8 -[UI应用程序 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 发送事件:] + 447 13 UIKit 0x003c19bf _UIApplicationHandleEvent + 7672 14 图形服务
0x033e6822 PurpleEventCallback + 1550 15 核心基础
0x02e36ff4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION
+ 52 16 核心基础 0x02d97807 __CFRunLoopDoSource1 + 215 17 核心基金会
0x02d94a93 __CFRunLoopRun + 979 18 核心基金会
0x02d94350 CFRunLoopRunSpecific + 208 19 核心基金会
0x02d94271 CFRunLoopRunInMode + 97 20 图形服务
0x033e500c GSEventRunModal + 217 21 图形服务
0x033e50d1 GSEventRun + 115 22 UIKit 0x003c5af2 UIApplicationMain + 1160 23首爱情诗
0x00002728 主 + 102 24 诗情 0x000026b9 开始 + 53 25 ???
0x00000001 0x0 + 1 ) 终止调用 在抛出一个实例之后 'NSException' 程序接收到的信号: “SIGABRT”。

伙计们,没有 NSArray!

我像这样保存到 NSUSerdefaults:

如果([可变 1 个计数]==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 时它会崩溃!

【问题讨论】:

  • 你能发布更多关于崩溃的信息吗?消息、堆栈跟踪等?
  • 你可能想要[NSMutableArray1 count]>=1,因为 ==1 只是检查是否有 1 且只有 1。
  • 你能说明你是如何声明'poemoptionslist'的吗?

标签: iphone nsmutablearray


【解决方案1】:
mutable1 = [[NSMutableArray alloc] init];
mutable1 = [prefs1 objectForKey:@"favorites"];

即使您已将 mutable1 声明为 NSMutableArray,您仍将其重新分配给 NSUserDefaults 对象返回的对象。这个对象显然是一个 NSArray 而不是 NSMutableArray,因此崩溃了。

您可以通过执行以下操作来加载带有首选项数组的 NSMutableArray:

mutable1 = [[NSMutableArray alloc] init];
[mutable1 addObjectsFromArray:[prefs1 objectForKey:@"favorites"]];

【讨论】:

  • 非常感谢我为这个问题搜索了几个小时!
  • 除了分配一个全新的'mutable1'之外,还有其他方法吗?就像mutable1 = [prefs1 objectForKey:@"favorites"]; 一样,我们这里不需要分配器。我试过mutable1 = (NSMutableArray*)[prefs1 objectForKey:@"favorites"]; 但失败了:(
  • 当然,如果偏好项@"favorites"实际上是一个数组,你不需要修改它,使用NSArray *faves = [prefs1 arrayForKey:@"favorites"];
【解决方案2】:

错误消息表明您将消息发送到不可变数组,这会引发异常。未捕获的异常会导致程序终止。

你是如何创建数组的?可能导致这种情况的最常见错误是执行以下操作:

[mutableArray copy]

即使您要复制的内容是可变的,副本也将是不可变的。在那个随机选择的示例中,使用 mutableCopy insted。

【讨论】:

    【解决方案3】:

    您在某处将 NSMutableArray1 设置为 NSArray 的实例,而不是 NSMutableArray,或者您将 NSMutableArray1 声明为 NSArray 与 NSMutableArray 类型的属性。

    此外,您应该遵循 Cocoa / Objective-C 命名约定。即类名以大写开头;变量采用 myArray1 的形式(或者最好是更具描述性的形式)。

    【讨论】:

      猜你喜欢
      • 2014-03-18
      • 2015-12-03
      • 1970-01-01
      • 2012-12-07
      • 1970-01-01
      • 2011-06-20
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多