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

Posted

技术标签:

【中文标题】发送到不可变对象的变异方法【英文标题】:Mutating method sent to immutable object 【发布时间】:2011-08-03 22:46:56 【问题描述】:

我正在使用 JSONKit 来解析从我的 iPhone 应用程序中的服务器返回的 JSON 字符串。服务器响应的一部分是一些 Base64 编码的图像,我想将它们解码为实际图像并添加到解析器创建的对象中。问题是我似乎无法弄清楚解析器返回什么样的类,以及可以用来与对象交互的方法。我在JSONKit documentation 上搜索了我的问题的答案,但没有找到。

decodedData = [[request responseString] objectFromJSONString];

int i = 0;
[Base64 initialize];
for (NSString *base64String in [decodedData valueForKey:@"base64String"]) 
    UIImage *image = [UIImage imageWithData:[Base64 decode:base64String]];
    [decodedData setValue:image forKey:@"image"];
    i++;

此代码放置在一个方法中,当请求成功完成并以[request responseString](JSON)返回响应时,该方法会被调用。 decodedData 对象的类在头文件中定义。无论我将其声明为什么(NSArrayNSMutableArrayNSDictionaryNSMutableDictionary),运行代码时都会出现相同的错误(它编译得很好),即:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '*** -[JKDictionary setObject:forKey:]: mutating method sent to immutable object'

谁能告诉我这个对象是什么类型的,我应该怎么做才能将 Base64 解码的图像添加到对象中?

我对 Objective-C 还很陌生,所以请耐心等待。谢谢。

【问题讨论】:

【参考方案1】:

您正在尝试改变不可变的 JKDictionary(它本身就是不可变的 NSDictionary 对象的代理)。

您链接到的文档在 NSString 上指定了一个名为 - (id)mutableObjectFromJSONString; 的实例方法,这将为您提供一个可变字典对象,如果您愿意,可以使用它。

【讨论】:

非常感谢!像魅力一样工作。

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

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

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

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

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

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

使用 userInfo (null) 发送到不可变对象的变异方法