2

我的里面有一个NSMutableArray我定义ViewController的数据源,UITableView如下所示:

NSMutableArray *messageArray;

我有一个重新加载 tableView 数据的方法,在此之前,我想清除现有的 table 数据。

如果我使用以下代码:

  [messageArray removeAllObjects];    
  [self.tableView reloadData];

我得到以下异常:

2013-02-12 14:20:30.378 appname[20998:907] * 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“-[__NSCFArray removeObjectAtIndex:]:发送到不可变对象的变异方法”*第一次抛出调用堆栈: (0x3939e3e7 0x35dd6963 0x3939e307 0x393200e7 0x392eb5e5 0x7cda3 0x3a236047 0x3a2360d1 0x3a236047 0x3a235ffb 0x3a235fd5 0x3a23588b 0x3a235d79 0x3a15e5c9 0x3a14b8b1 0x3a14b1bf 0x336305f7 0x33630227 0x393733e7 0x3937338b 0x3937220f 0x392e523d 0x392e50c9 0x3362f33b 0x3a19f291 0x79c11 0x39be4b20)的libc ++ abi.dylib:终止称为抛出异常

但是如果我使用下面的代码,它就可以工作。

  NSMutableArray *emptyArray = [NSMutableArray new];
  messageArray = emptyArray;    
  [self.tableView reloadData];

为什么我会收到错误消息removeAllObjects?这可能是罪魁祸首吗?

    NSMutableDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:nil];
    messageArray = responseDictionary[@"data"];
4

6 回答 6

5

这可能是罪魁祸首吗?

NSMutableDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:nil];
messageArray = responseDictionary[@"data"];

是的,您想使用可变容器的选项:

NSMutableDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:responseData options: NSJSONReadingMutableContainers error:NULL];
于 2013-02-12T14:39:42.607 回答
2

看起来您的“NSMutableArray”实际上是一个 NSArray 转换为 NSMutableArray。

在您的代码中搜索如下内容:

messageArray = (NSMutableArray *)[obj methodReturningNSArray];

removeAllObjects仅适用于真正的 NSMutableArray,因为错误“发送到不可变对象的变异方法”状态。

于 2013-02-12T14:27:33.663 回答
1

你必须改变这一行:

messageArray = responseDictionary[@"data"];

到:

messageArray = [responseDictionary[@"data"] mutableCopy];

默认情况下,您从字典中获取的对象是非可变对象

于 2013-02-12T14:33:02.977 回答
0

您的messageArray数据重新加载返回的不是NSMutableArray,而是NSArray. 如果在重新加载后放置调试器停止,您可以验证这一点。.mutableCopy设置时使用messageArray

于 2013-02-12T14:29:44.220 回答
0

如何找到有错误的地方:

  1. 检查您是否@synthesize 一个名为messageArray. 如果此属性是NSArray类型或使用copy修饰符声明的,则合成的 setter 是罪魁祸首。
  2. 如果不是,请重新声明 ivar NSMutableArray *const messageArray。现在编译器将向您显示每个分配。检查 NSArray 分配。不要忘记在那之后恢复声明。
  3. 完成后,将 ivar 重命名为,_messageArray以便将来更快地找到直接访问。
于 2013-02-12T14:34:23.220 回答
0

某处您已设置NSMutableArrayNSArray, not的实例,NSMutableArray或者您声明NSMutableArray为 type 的属性NSArray vs. NSMutableArray

Cocoa文档使用这个词immutable指代只读的初始化后不能更改的对象

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

您可以在copyWithZone 参考NSMutableCopying 协议参考中找到更多详细信息。

于 2013-02-12T14:34:56.343 回答