NSInternalInconsistencyException

时间:2012-11-08 14:10:29

标签: objective-c ios5

我正在尝试从数组中删除最后两个值。所以,我以前做过以下代码 -

-(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类中使用过这个方法了。那里工作得很好。但是,这里给出例外。

1 个答案:

答案 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]];