【问题标题】:NSInternalInconsistencyExceptionNSInternalInconsistencyException
【发布时间】:2012-11-08 14:10:29
【问题描述】:

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

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

【问题讨论】:

    标签: objective-c ios5


    【解决方案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]];
    

    【讨论】:

    • 或使用NSJSONReadingMutableContainers
    • 那么,我必须从数组副本mutableArray 中删除这两个值?
    • @mattjgalloway 也打算添加 :)
    • @SpK 是的,或者你可以接受 mattjgalloway 的建议,而不是在你的选项中传递 0,你可以传递 NSJSONReadingMutableContainers 选项。
    • @mattjgalloway 但是,当我尝试两种方式时,它会删除我的旧记录:(
    猜你喜欢
    • 2014-08-31
    • 2014-11-06
    • 2013-02-14
    • 1970-01-01
    • 2017-09-02
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 2023-04-06
    相关资源
    最近更新 更多