removeAllObjects崩溃应用程序

时间:2014-02-18 12:30:12

标签: 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)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是mutabledictionary

(取自comments

5 个答案:

答案 0 :(得分:7)

  

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

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

如果你想改变它,可以使它变得可变。或者,替换:

[msg_array removeAllObjects];

使用:

msg_array = @[];

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

答案 1 :(得分:2)

因为你试图修改一个不可变数组,所以你有两个选择:

msg_array = @[];

OR

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

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

NB:

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

答案 2 :(得分:1)

__NSArrayI,仔细查看这一点,我们可以看到它后缀为i。此i表示数组为i mmutable,无法更改。

您可能想要使用NSMutableArray

  

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

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

我认为可能意味着可变阵列;假设您这样做,对copy的调用将返回一个不可变对象,请尝试[dictShow mutableCopy]

答案 3 :(得分:1)

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

答案 4 :(得分:0)

msg_array = [NSMutableArray arrayWithArray:_MoodsArray] .mutableCopy;