将不可变对象转换为可变对象(递归)的最佳方法是什么?

时间:2011-12-04 02:24:21

标签: objective-c type-conversion mutable

具体来说,当我使用带有JSONkit的AFNeworking发出请求并且接收到嵌套了几个数组和字典的(id)JSON时,这个问题就出现了。

如果我不想修改数据,我没有任何问题:

self.myNSArray = [JSON objectForKey:@"result"];

但如果我想修改数据,我必须将其存储在一个可变变量中:

self.myNSMutableArray = [[JSON objectForKey:@"result"] mutableCopy];

最后一个不会将嵌套数组或字典转换为可变数据;它仅适用于第一级。

我找到的唯一方法是在此链接上recursive mutable objects;但我不知道是否有解决此类问题的最佳方法。

提前致谢。

3 个答案:

答案 0 :(得分:11)

您可以将CoreFoundation函数CFPropertyListCreateDeepCopy与可变性选项kCFPropertyListMutableContainersAndLeaves一起使用:

NSArray *immutableArray = [JSON objectForKey:@"result"];
self.myMutableArray = [(NSMutableArray *)CFPropertyListCreateDeepCopy(NULL, immutableArray, kCFPropertyListMutableContainersAndLeaves) autorelease];

答案 1 :(得分:5)

在ARC:

CFBridgingRelease(CFPropertyListCreateDeepCopy(NULL, (__bridge CFPropertyListRef)(immutableArray), kCFPropertyListMutableContainersAndLeaves))

真的很有效。谢谢 brainjam。

答案 2 :(得分:0)

确保你在响应字符串中处理null值,否则它将返回nil,这会导致可怕的结果。

(例如,尝试mutataing响应来自 http://www.json-generator.com/api/json/get/bQVoMjeJOW?indent=1

将API响应转换为JSON对象时,只需放在下面。

responseString=[responseString stringByReplacingOccurrencesOfString:@"\":null" withString:@"\":\"\""];//To Handle Null Characters

//Search for below line in your parsing library and paste above code
data = [responseString dataUsingEncoding:NSUTF8StringEncoding];

因此JSON对象中不会出现空字符,因此使用CFPropertyListCreateDeepCopy时没有问题。

干杯!!