删除NSMutableArray上的对象会导致崩溃

时间:2014-03-07 21:33:24

标签: ios objective-c uitableview nsmutablearray

尝试删除NSMutableArray上的对象会导致崩溃:

 2014-03-07 18:58:03.755 HomeWork Pro +[12637:70b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0xa2f4c20'

删除目标代码:

[hwArray removeObjectAtIndex:self.indexPath.row];

只有当我使用self.indexPath.row执行此操作时才会发生这种情况,如果我使用正常运行的数字执行此操作。我知道self.indexPath.row不是nil,我已经记录了它以确保它正确。在做完之后我做了

[table reloadData]

重新加载UITableView数据和方法。 这里有什么问题的线索? 调用堆栈

*** First throw call stack:
(
0   CoreFoundation                      0x017aa5e4 __exceptionPreprocess + 180
1   libobjc.A.dylib                     0x0152d8b6 objc_exception_throw + 44
2   CoreFoundation                      0x01847903 -[NSObject(NSObject) doesNotRecognizeSelector:] + 275
3   CoreFoundation                      0x0179a90b ___forwarding___ + 1019
4   CoreFoundation                      0x0179a4ee _CF_forwarding_prep_0 + 14
5   HomeWork Pro +                      0x00006c88 -[HomeWork SelfDelete] + 216
6   HomeWork Pro +                      0x0000711a -[HomeWork done:] + 618
7   libobjc.A.dylib                     0x0153f874 -[NSObject performSelector:withObject:withObject:] + 77
8   UIKit                               0x0029d0c2 -[UIApplication sendAction:to:from:forEvent:] + 108
9   UIKit                               0x0029d04e -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 61
10  UIKit                               0x003950c1 -[UIControl sendAction:to:forEvent:] + 66
11  UIKit                               0x00395484 -[UIControl _sendActionsForEvents:withEvent:] + 577
12  UIKit                               0x00394733 -[UIControl touchesEnded:withEvent:] + 641
13  UIKit                               0x002da51d -[UIWindow _sendTouchesForEvent:] + 852
14  UIKit                               0x002db184 -[UIWindow sendEvent:] + 1232
15  UIKit                               0x002aee86 -[UIApplication sendEvent:] + 242
16  UIKit                               0x0029918f _UIApplicationHandleEventQueue + 11421
17  CoreFoundation                      0x0173383f __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
18  CoreFoundation                      0x017331cb __CFRunLoopDoSources0 + 235
19  CoreFoundation                      0x0175029e __CFRunLoopRun + 910
20  CoreFoundation                      0x0174fac3 CFRunLoopRunSpecific + 467
21  CoreFoundation                      0x0174f8db CFRunLoopRunInMode + 123
22  GraphicsServices                    0x023349e2 GSEventRunModal + 192
23  GraphicsServices                    0x02334809 GSEventRun + 104
24  UIKit                               0x0029bd3b UIApplicationMain + 1225
25  HomeWork Pro +                      0x00008bad main + 141
26  libdyld.dylib                       0x02c8a70d start + 1
27  ???                                 0x00000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

2 个答案:

答案 0 :(得分:2)

在我看来,您发布的崩溃消息与您的堆栈跟踪不匹配。堆栈跟踪显示"无法识别的选择器"崩溃,但崩溃消息显示您正在尝试将nil对象插入到数组中。

这些内容都不符合您发布的代码行。 (从数组中删除一个对象。)如果数组不是一个可变数组,我猜你可能会从你发布的源代码行中得到一个无法识别的选择器错误...

编辑:

根据您更新的问题,很清楚。你的数组实际上并不是一个可变数组,即使你认为它也是。

发布创建数组的代码。

如果您要将其复制到某处,请仔细查看该代码。如果您从plist或archive中加载它,请注意当您重新读取它们时,可变数组会以不可变的形式返回。

答案 1 :(得分:1)

你拥有的是一个不可变的NSArray。你想要的是NSMutableArray,它实际上实现了removeObjectAtIndex:。确保您的数组在某些时候不会被不可变版本替换。