崩溃:发送到不可变对象的变异方法

Posted

技术标签:

【中文标题】崩溃:发送到不可变对象的变异方法【英文标题】:Crash: mutating method sent to immutable object 【发布时间】:2014-02-24 13:52:04 【问题描述】:

我正在尝试删除 NSMutableDictionary 中特定键的对象,但尝试执行此操作时应用程序崩溃。这是我的代码:

    NSArray *allWebDictionary = [NSJSONSerialization JSONObjectWithData:webData options:0 error:nil];
    self.results = [[NSMutableArray alloc] initWithArray:allWebDictionary];

    for (NSMutableDictionary *dic2 in self.results) 
        NSMutableArray *incidents = [dic2 valueForKey:@"incidents"];
        for (NSMutableDictionary *incident in incidents) 
            [incident removeObjectForKey:@"type"];
        
    

我的应用程序崩溃并显示以下日志:

* 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“-[__NSCFDictionary removeObjectForKey:]: mutating method sent to immutable object”

有什么想法吗?提前致谢!

【问题讨论】:

您是否尝试过使用选项指定NSJSONReadingMutableContainers 而不是0?总是更好地使用提供的常量。另外,在获得值后,坚持一个断点并检查以查看真实的数据类型。 【参考方案1】:

您制作了数组的可变副本,但数组中的字典仍然不可变。

你需要可变容器。

替换

NSArray *allWebDictionary = [NSJSONSerialization JSONObjectWithData:webData
                                                            options:0
                                                              error:nil];

NSMutableArray *allWebDictionary = [NSJSONSerialization JSONObjectWithData:webData
                                                                   options:NSJSONReadingMutableContainers
                                                                     error:nil];

【讨论】:

以上是关于崩溃:发送到不可变对象的变异方法的主要内容,如果未能解决你的问题,请参考以下文章

发送到不可变对象的变异方法

使用可变数组函数时,将变异方法发送到不可变对象错误

发送到不可变对象的变异方法 - iOS [重复]

尽管对象是 NSMutableDictionary,但“发送到不可变对象的变异方法”

使用 NSMutableArray 将变异方法发送到不可变对象

发送到不可变对象的变异方法