清空所有对象导致应用程序崩溃

3
我希望清空我的数组,我所做的是,
我在我的应用程序中有一个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)


1
msg_array是NSArray还是NSMutableArray?因为NSArray没有名为removeAllObjects的方法。因此导致了崩溃。 - Divya
5个回答

8

'-[__NSArrayI removeAllObjects]: unrecognized selector sent to instance

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

如果要更改它,请将其变为可变的。或者,替换:

[msg_array removeAllObjects];

使用:

msg_array = @[];

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


它是可变的,只能这样声明:在.h文件中声明NSMutableArray *msg_array - Krunal
但是你在哪里创建实例并分配它呢?这很可能是你的问题所在... - Wain
你能发一下填充数据的代码吗? - Nikita Kukushkin
你只在那个地方分配 msg_array 吗? - Wain
2
"copy]返回NSArray,这就是你的问题。请将其替换为mutableCopy]。" - Nikita Kukushkin
显示剩余8条评论

2

这是因为您正在尝试修改一个不可变数组,您有两个选项:

msg_array = @[];

或者

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

我更喜欢第一种选择,因为它更整洁。但是如果您需要对数组进行其他修改,则后一种选择可能更适合您。

注意:

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


msg_array = [dictShow copy]; dictshow 包含数据,将其复制到 msg_array 中,dictshow 是 mutableDictionary。 - Krunal
将 copy 改为 mutableCopy! [dictShow mutableCopy] - Oliver Atkinson

1

__NSArrayI,仔细观察这一部分,我们可以看到它后缀有一个 i。这个 i 意味着数组是不可变的,无法更改。

您可能想使用一个 NSMutableArray

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

这非常奇怪!我期望在字典上调用 copy 总是会返回一个字典。除非您弄错了,否则我只能想象要么字典的键被返回,要么它的值被返回。

我认为您可能想使用可变数组;假设您这样做了,调用 copy 返回一个不可变对象,尝试使用 [dictShow mutableCopy]


它是可变的,只能这样声明:在.h文件中声明NSMutableArray *msg_array - Krunal
你是如何分配那个数组的?你能展示一下看起来像这样的代码段吗:msg_array = ... - James Webster
msg_array = [dictShow copy]; dictshow 包含数据,并将其复制到 msg_array,dictshow 是可变字典。 - Krunal

1

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


它是可变的,只能这样声明:在.h文件中声明NSMutableArray *msg_array - Krunal
即使您将其声明为NSMutableArray,也要检查您是否将NSArray分配给它。 - Anil Varghese
msg_array = [dictShow copy]; // 将 dictShow 中的数据复制到 msg_array 中,dictShow 是可变字典类型 - Krunal

0

msg_array = [NSMutableArray arrayWithArray:_MoodsArray].mutableCopy;

msg_array = [NSMutableArray arrayWithArray:_MoodsArray].mutableCopy;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接