我正在尝试从数组中删除最后两个值。所以,我以前做过以下代码 -
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSString *resMsg = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding];
NSData *responseData = [resMsg dataUsingEncoding:NSUTF8StringEncoding];
NSError *error = nil;
if (responseData != nil)
{
array = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error];
if([array count] == 2) {
}else
{
int k = [self.array count] -2 ;
int l = [self.array count] -1 ;
[self.array removeObjectAtIndex:l];
[self.array removeObjectAtIndex:k];
[gridTable reloadData];
[tblProducts reloadData];
}
}
}
但是,它给出了以下异常 -
由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:' - [__ NSCFArray removeObjectAtIndex:]:发送到不可变对象的变异方法'
我不知道为什么会这样?我已经在另一个viewController类中使用过这个方法了。那里工作得很好。但是,这里给出例外。
答案 0 :(得分:1)
从[NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error];
返回的对象将返回自动释放的NSArray
。如果您想让它变得可变,则必须致电NSMutableArray *mutableArray = [array mutableCopy];
此处您的其他选项不是为options:
参数添加0,而是放置NSJSONReadingMutableContainers
。这将解决您的问题,而无需创建额外的对象。
修改强>
为了解决您的新问题:
NSMutableArray *newData = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:&error];
//Here, modify the new array. Remove your last two items. Then..
[newData addObjectsFromArray:array];
array = newData;
作为旁注,这可能会导致您的数组对象的顺序与您预期的顺序不同。你可以选择打电话给这个......
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"key" ascending:YES];
array = [newData sortedArrayUsingDescriptors:[NSArray arrayWithObject:sort]];