2

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

-(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:]: mutating method sent to immutable object”

我不知道为什么会这样?我也已经在另一个 viewController 类中使用过这个方法。它在那里工作得很好。但是,这里是例外。

4

1 回答 1

1

从返回的对象[NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error];将返回一个 autoreleased NSArray。如果你想让它可变,你必须打电话NSMutableArray *mutableArray = [array mutableCopy];

您在这里的另一个选择是代替为您的options:参数输入 0 , put 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]];
于 2012-11-08T14:14:14.273 回答