在以下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在做什么。
答案 0 :(得分:1)
大部分基金会都是class clusters。 TL; DR作为NSString与之交互,但基础将改变支持实现,以根据实际内容优化某些性能或空间特征。
如果您感到好奇,其中一个基金会团队会从iOS 11 here
中删除一个类集群列表答案 1 :(得分:0)
我通过使用“ MUTABLECOPY”修复了该问题
我有同样的问题。对于某些“性能”机制,苹果显然将NSTaggedPointerString用于“加利福尼亚”之类的“知名”字符串,但这可能是一个问题,因为出于某些奇怪的原因,NSJSONSerialization不会在这种NSTaggedPointerString类型的字符串周围添加引号。解决方法很简单:
NSString *taggedString = @"California";
[data setObject:[taggedString mutableCopy] forKey:@"state"]
像魅力一样工作。