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

mar*_*iva 10 objective-c mutable type-conversion

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

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

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

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

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

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

我找到的唯一方法是在这个链接上递归可变对象 ; 但我不知道是否有解决此类问题的最佳方法.

提前致谢.

omz*_*omz 11

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

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

  • ARC等价似乎是`CFBridgingRelease(CFPropertyListCreateDeepCopy(NULL,(__ bridge CFPropertyListRef)(immutableArray),kCFPropertyListMutableContainersAndLeaves));` (2认同)

Hoa*_*Huu 5

在ARC上:

CFBridgingRelease(CFPropertyListCreateDeepCopy(NULL, (__bridge CFPropertyListRef)(immutableArray), kCFPropertyListMutableContainersAndLeaves))
Run Code Online (Sandbox Code Playgroud)

真的很有效.谢谢你的脑筋急转弯.