NSJSONSerialization生成NSCFString *和NSTaggedPointerString *

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NSJSONSerialization生成NSCFString *和NSTaggedPointerString *相关的知识,希望对你有一定的参考价值。

在以下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 *。这对我正在使用和投射值的下游产生影响。

UPDATE

这是我学到的......

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

这里有一个详细的解释......

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

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

感谢所有评论的人。我很自在地理解NSJSONSerialization在做什么。

答案

很多基金会都是以class clusters的形式实施的。 TL; DR作为NSString与之交互,但基础将改变支持实现,以根据实际内容优化某些性能或空间特征。

如果你很好奇,其中一个基金会团队会从ios 11 here中删除一个类集群列表

另一答案

我用“MUTABLECOPY”来固定它

我遇到过同样的问题。对于一些“性能”机制显然苹果使用NSTaggedPointerString作为“众所周知”的字符串,如“加利福尼亚”,但这可能是一个问题,因为由于一些奇怪的原因,NSJSONSerialization不会在这个NSTaggedPointerString类型的字符串周围添加引号。解决方法很简单:

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

奇迹般有效。

以上是关于NSJSONSerialization生成NSCFString *和NSTaggedPointerString *的主要内容,如果未能解决你的问题,请参考以下文章

NSJSONSerialization 不解析 NSManagedObject

NSJSONSerialization 拆箱 NSNumber?

NSJSONSerialization 没有返回错误

NSJSONSerialization - 无法将数据转换为字符串

Swift 2 - NSJSONSerialization.JSONObjectWithData 处理错误 [重复]

使用 NSJSONSerialization 解析 twitter 搜索 json 数据