【问题标题】:What is the best approach to convert immutable objects to mutable objects (recursive)?将不可变对象转换为可变对象(递归)的最佳方法是什么?
【发布时间】:2012-01-12 10:52:45
【问题描述】:

具体来说,当我使用 AFNeworking 与 JSONkit 一起发出请求并接收到嵌套了多个数组和字典的 (id)JSON 时,我遇到了这个问题。

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

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

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

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

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

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

提前致谢。

【问题讨论】:

    标签: objective-c type-conversion mutable


    【解决方案1】:

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

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

    【讨论】:

    • ARC 等效项似乎是 CFBridgingRelease(CFPropertyListCreateDeepCopy(NULL, (__bridge CFPropertyListRef)(immutableArray), kCFPropertyListMutableContainersAndLeaves));
    • @omz 这应该适用于字典,你知道吗?似乎无法转换。
    • 应该的。请发布一个包含更多详细信息的单独问题。
    • 这个 seems to return a nil value 如果 immutableArray 在某处有一个 NULL,你是否知道在这些情况下的解决方法?
    • @Sathvik 属性列表根本不支持 NSNull 值。如果要序列化包含它们的集合,请考虑使用NSJSONSerializationNSKeyedArchiver
    【解决方案2】:

    在 ARC 上:

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

    确实有效。谢谢 脑筋急转弯。

    【讨论】:

      【解决方案3】:

      确保您在响应字符串中处理 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 没有问题。

      干杯!!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-27
        • 1970-01-01
        • 1970-01-01
        • 2015-01-09
        • 1970-01-01
        相关资源
        最近更新 更多