2012-11-08 30 views
2

我想从数组中删除最后两个值。所以,我用来做下面的代码 -NSInternalInconsistencyException

-(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]; 
     } 

    } 

} 

但是,异常低于其给予 -

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFArray removeObjectAtIndex:]: mutating method sent to immutable object'

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

回答

1

[NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error];返回的对象将返回一个自动发布NSArray。如果你想让它可变的,你必须调用NSMutableArray *mutableArray = [array mutableCopy];

你的另一种选择是在这里,而不是投入0您options:参数,把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]]; 
+2

或者使用'NSJSONReadingMutableContainers'。 – mattjgalloway

+0

所以,我必须从作为数组副本的'mutableArray'中移除这两个值? – Praveenkumar

+0

@mattjgalloway只是要补充一点:) – DavidAndroidDev

相关问题