【问题标题】:NSJSONSerialization generating NSCFString* and NSTaggedPointerString*NSJSONSerialization 生成 NSCFString* 和 NSTaggedPointerString*
【发布时间】:2015-10-13 14:47:26
【问题描述】:

对以下 json 执行 NSJSONSerialization 有时会给我 NSCFString* ,有时会在字符串值上给我 NSTaggedPointerString* 。有谁知道为什么会这样以及 NSJSONSerialization 使用什么来确定它返回的类型?

jsonData = [NSJSONSerialization JSONObjectWithData:data
                                                   options:kNilOptions
                                                     error:&parseError];

    {
      "UserPermissionsService": {
        "ServiceHeader": {}, 
        "UserApplicationPermissions": {
          "ApplicationPermissions": {
            "ApplicationID": "TEST", 
            "Permission": [
              {
                "Locations": [
                  "00000"
                ], 
                "PermissionID": "LOGIN"
              }, 
              {
                "Locations": [
                  "00000"
                ], 
                "PermissionID": "SALES_REPORT_VIEW"
              }
            ]
          }
        }
      }
    }

“LOGIN”作为 NSTaggedPointerString* 返回。 “SALES_REPORT_VIEW”返回的是一个 NSCFString*。这对我使用和转换值的下游产生了影响。

更新

这是我学到的……

“当整个值可以保存在指针本身而不分配任何数据时,NSTaggedPointerString 的结果。”

这里有详细的解释...

https://www.mikeash.com/pyblog/friday-qa-2015-07-31-tagged-pointer-strings.html

由于 NSTaggedPointerString 是 NSString 的子类,显示引号/不显示引号对我来说永远不会成为问题,因为使用了数据。

感谢所有评论的人。我很清楚 NSJSONSerialization 在做什么。

【问题讨论】:

  • 你在做什么才能有所作为?你总是得到一个 NSString*。 NSString* 的哪个子类对你来说不重要。
  • 谷歌搜索 NSTaggedPointerString。如果这对你有影响,那么你做的事情非常非常错误。标记指针在 64 位系统上非常常见,用于小值,整个值可以保存在指针本身中而无需分配任何数据。
  • @Justin Domnitz 我不相信你在这里是正确的,请添加一个你如何使用值或它们的类型的例子。
  • 我认为我们在这里有点偏离了轨道。 :) 我真的只是想了解我从 NSJSONSerialization 得到的结果。最佳答案似乎来自 gnasher729 关于系统确定“当整个值可以保存在指针本身而不分配任何数据时产生 NSTaggedPointerString ”。任何人都可以指出我的文档吗?谷歌没有提供任何有用的东西(这就是我在这里发布问题的原因)。
  • 大声笑@gnasher729 有人带着问题来到stackoverflow,但收到了更多问题,太好了……此外,贾斯汀如果你找到了答案,请创建一个并将你的标记为已回答。例如,当 NSJSONSerialization 将字典键弄乱为 NSTaggedPointerStrings 并且无法再访问这些值时,我遇到了问题,除非它们被显式强制转换,这使得索引看起来很讨厌

标签: objective-c json nsstring foundation nsjsonserialization


【解决方案1】:

Foundation 的大部分实现为class clusters。 TL;DR 您将其作为 NSString 进行交互,但基础将更改支持实现以根据实际内容优化某些性能或空间特征。

如果你好奇的话,Foundation 团队中的一个人提供了一份自 iOS 11 起的类集群列表here

【讨论】:

    【解决方案2】:

    我通过使用“MUTABLECOPY”修复它

    我有同样的问题。对于某些“性能”机制,显然苹果将 NSTaggedPointerString 用于“众所周知的”字符串,例如“California”,但这可能是一个问题,因为出于某种奇怪的原因,NSJSONSerialization 不会在此 NSTaggedPointerString 类型的字符串周围添加引号。解决方法很简单:

    NSString *taggedString = @"California";
    [data setObject:[taggedString mutableCopy] forKey:@"state"]
    

    像魅力一样工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-26
      • 1970-01-01
      • 2015-03-11
      • 2012-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多