【问题标题】:removeAllObjects crashes appremoveAllObjects 使应用程序崩溃
【发布时间】:2014-03-18 05:08:59
【问题描述】:

我想清除我的数组,我所做的是,

我的应用中有 tableview 视图,首先我从服务器获取数据并将其加载到 tableView 中。

-(void)viewDidLoad{

  //fetching data from server using background thread and storing it in array called (msg_array)
  [table reloadData];

}

当最后一行出现在屏幕上时,我想从服务器获取新数据并显示它,

-(void)LoadMoreData{ //this method gets fire when last cell is on screen 

    if ([msg_array count]>0) 
    {
        [msg_array removeAllObjects];  //crashes here
    }

}

这给出了错误:

Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[__NSArrayI removeAllObjects]: unrecognized selector sent to instance

为什么会导致崩溃:

数组是这样分配的:

msg_array = [dictShow copy];

dictshow 包含数据并将其复制到 msg_array 并且 dictshow 是可变字典

(取自comments

【问题讨论】:

  • 是 msg_array NSArray 还是 NSMutableArray?因为 NSArray 没有一个名为 removeAllObjects 的方法。因此崩溃了。

标签: ios iphone objective-c ipad nsarray


【解决方案1】:

'-[__NSArrayI removeAllObjects]: 无法识别的选择器发送到实例

这意味着该数组没有您尝试调用的方法。那是因为它是一个不可变数组 (NSArray),而不是可变数组 (NSMutableArray)。

如果你想改变它,要么让它可变。或者,替换:

[msg_array removeAllObjects];

与:

msg_array = @[];

根据您的评论,该数组应该是可变的。这意味着您有一个可变的属性/实例变量,但是您正在创建一个不可变的实例来存储它。找到那个位置并更新它(至少创建/返回一个mutableCopy)。

【讨论】:

  • 它只是可变的......在 .h 文件中以这种方式声明 NSMutableArray *msg_array
  • 但是你在哪里创建一个实例并分配它?这很可能是您的问题所在......
  • msg_array =[[NSMutableArray alloc] init]; in viewDidLoad
  • 你能发布你用数据填充它的代码吗?
  • copy] 返回 NSArray,这是你的问题。将其替换为 mutableCopy]。
【解决方案2】:

因为您正在尝试修改不可变数组,所以这里有两种选择:

msg_array = @[];

NSMutableArray *mutableMessageArray = [msg_array mutableCopy];
[mutableMessageArray removeAllObjects];
msg_array = [mutableMessageArray copy];

我更喜欢第一个选项,因为它更简洁,但如果您需要对数组进行任何其他修改,后一个选项可能最适合您。

注意:

检查您如何声明msg_array,您可以发布该代码吗?

【讨论】:

  • msg_array = [dictShow copy]; dictshow 包含数据并将其复制到 msg_array 并且 dictshow 是可变字典
  • 将副本更改为 mutableCopy! [dictShow mutableCopy]
【解决方案3】:

msg_array 可能是不可变的,这就是它崩溃的原因。 removeAllObjects 仅适用于NSMutableArray

【讨论】:

  • 它只是可变的...在 .h 文件中以这种方式声明 NSMutableArray *msg_array
  • 即使您将其声明为NSMutableArray,请检查您是否为其分配了 NSArray
  • msg_array = [dictShow copy]; dictshow 包含数据并将其复制到 msg_array 并且 dictshow 是可变字典
【解决方案4】:

__NSArrayI,仔细看这个位,我们可以看到它的后缀是i。这个i 表示数组是immutable 并且不能更改。

您可能想使用NSMutableArray

msg_array = [dictShow copy]; dictshow 包含数据并将其复制到 msg_array 并且 dictshow 是可变字典

这很奇怪!我希望在字典上调用 copy 总是会返回字典。除非你在那里弄错了,否则我只能想象字典的键或其值正在被返回。

我认为您可能指的是可变数组;假设你这样做了,对 copy 的调用会返回一个不可变对象,请尝试使用 [dictShow mutableCopy] 代替

【讨论】:

  • 它只是可变的...在 .h 文件中以这种方式声明 NSMutableArray *msg_array
  • 你是如何分配这个数组的?你能告诉我们看起来像这样的位吗:msg_array = ...
  • msg_array = [dictShow copy]; dictshow 包含数据并将其复制到 msg_array 并且 dictshow 是可变字典
【解决方案5】:

msg_array = [NSMutableArray arrayWithArray:_MoodsArray].mutableCopy;

【讨论】:

    猜你喜欢
    • 2011-04-26
    • 2018-08-28
    • 2013-01-27
    • 1970-01-01
    • 2017-11-10
    • 2012-08-18
    • 2012-02-12
    • 2014-11-14
    • 2018-12-05
    相关资源
    最近更新 更多