应用程序崩溃:发送到不可变对象的变异方法

Posted

技术标签:

【中文标题】应用程序崩溃:发送到不可变对象的变异方法【英文标题】:App Crashing: Mutating method sent to immutable object 【发布时间】:2014-04-05 16:13:05 【问题描述】:

我正在尝试将对象添加到 NSMutableArray。最初,我将一些响应数据分配给数组,并可以将其显示在表格视图中。加载更多数据后,尝试将新信息添加到我的原始数组时似乎崩溃了。

我为此使用 AFNetworking:

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) 

    if(!_myArray)
        _myArray = [responseObject objectForKey:@"data"];
    
    else
        [_myArray addObject:[responseObject objectForKey:@"data"]];
    
    [self.tableView reloadData];

我得到的错误如下

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

有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

您从responseObject 字典中检索的对象很可能不是NSMutableArray,而是(不可变的)NSArray。您必须创建一个可变副本才能对其进行更改:

//...
if (!_myArray) 
    _myArray = [[responseObject objectForKey:@"data"] mutableCopy];

//...

【讨论】:

【参考方案2】:

听起来 AFNetworking 生成不可变对象。您应该调用-mutableCopy 而不是直接分配-objectForKey: 的结果。

你真的打算拥有一堆嵌套数组吗?如果您添加响应数组的内容而不是数组本身,似乎会更有意义。

【讨论】:

【参考方案3】:

您需要制作数组的副本。之后,您必须使用 [NSMutableArray arrayWithArray: ] 修改该数组

【讨论】:

【参考方案4】:

你的数组必须是可变数组

使用 NSMutablearray 代替 NSArray

【讨论】:

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

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

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

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

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

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

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