Ios removeAllObjects应用程序崩溃

Ios removeAllObjects应用程序崩溃,ios,iphone,objective-c,ipad,nsarray,Ios,Iphone,Objective C,Ipad,Nsarray,我想清除我的阵列,我所做的是 我的应用程序中有tableview视图,首先我从服务器获取数据并将其加载到tableview中 -(void)viewDidLoad{ //fetching data from server using background thread and storing it in array called (msg_array) [table reloadData]; } 当屏幕上出现最后一行时,我想从服务器获取新数据并显示它 -(void)LoadMore

我想清除我的阵列,我所做的是

我的应用程序中有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_数组,dictshow是可变字典


(摘自)

\uu NSArrayI
,仔细看这一位,我们可以看到它的后缀是
i
。此
i
表示数组是可更改的,不能更改

您可能希望使用
NSMutableArray


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

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


我想你可能指的是可变数组;假设您这样做了,对
copy
的调用将返回一个不可变对象,请尝试
[dictShow mutableCopy]
而不是
msg\u array
可能是不可变的,这就是它崩溃的原因
removeAllObjects
仅适用于
NSMutableArray

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

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

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

[msg_array removeAllObjects];
与:



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

因为您试图修改一个不可变数组,所以这里有两个选项:

msg_array = @[];

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

注意:


检查您如何声明
msg\u array
,您可以发布该代码吗?

msg\u array=[NSMutableArray arrayWithArray:\u MoodArray].mutableCopy

msg_数组是NSArray还是NSMutableArray??因为NSArray没有名为removeAllObjects的方法。因此崩溃。它只能是可变的。。。以这种方式在.h文件中声明
NSMutableArray*msg_array
,即使您将其声明为
NSMutableArray
,也要检查是否为其分配了一个NSArray
msg_array=[dictShow copy]
dictshow包含数据并将其复制到
msg_array
中,dictshow是可变字典,它只是可变的。。。在.h文件中以这种方式声明了
NSMutableArray*msg_array
,但是您在哪里创建实例并分配它呢?这可能是您的问题所在…
msg_array=[[NSMutableArray alloc]init]
viewdiload
中,您可以将代码发布到使用数据填充的位置吗?copy]返回NSArray,这是您的问题。将其替换为mutableCopy]。它仅可更改。。。在.h文件中以这种方式声明
NSMutableArray*msg_array
?你能给我们看一下这个位吗:
msg_数组=…
msg_数组=[dictShow copy]
dictshow包含数据并将其复制到msg_数组,dictshow是可变字典
msg_数组=[dictshow copy]
dictshow包含数据并将其复制到msg_数组,dictshow是mutabledictionaryChange copy to mutableCopy![dictShow mutableCopy]
msg_array = @[];
NSMutableArray *mutableMessageArray = [msg_array mutableCopy];
[mutableMessageArray removeAllObjects];
msg_array = [mutableMessageArray copy];