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

10

具体来说,当我使用AFNetworking与JSONkit进行请求并接收一个包含多个嵌套数组和字典的(id)JSON时,就会遇到这个问题。

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

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

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

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

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

我唯一找到的方法是在这个链接recursive mutable objects上;但我不知道是否有更好的方法来解决这种问题。

提前致谢。

3个回答

11
你可以使用CoreFoundation函数CFPropertyListCreateDeepCopy和可变性选项kCFPropertyListMutableContainersAndLeaves来进行深度拷贝:
NSArray *immutableArray = [JSON objectForKey:@"result"];
self.myMutableArray = [(NSMutableArray *)CFPropertyListCreateDeepCopy(NULL, immutableArray, kCFPropertyListMutableContainersAndLeaves) autorelease];

2
ARCзҡ„зӯүж•Ҳж–№жі•дјјд№ҺжҳҜCFBridgingRelease(CFPropertyListCreateDeepCopy(NULL, (__bridge CFPropertyListRef)(immutableArray), kCFPropertyListMutableContainersAndLeaves));гҖӮ - brainjam
1
@omz 这对字典也适用吗?我无法转换它。 - Dom Vinyard
应该是的。请发布一个带有更多细节的单独问题。 - omz
如果immutableArray中有任何NULL的情况下,此代码似乎会返回一个nil值。您知道在这种情况下的解决方法吗?参考链接 - S P
1
@Sathvik 属性列表不支持 NSNull 值。如果您想序列化包含它们的集合,请考虑使用 NSJSONSerializationNSKeyedArchiver - omz

5

关于ARC:

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

真的起作用了。谢谢brainjam。

0
确保在响应字符串中处理null值,否则它将返回nil,导致结果不可预料。
(例如,请尝试修改来自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不会出现任何问题。

干杯!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接