我想清除我的阵列,我做的是,
我的应用程序中有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)
答案 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;