objective c - NSJSONSerializaciĆ³n que genera NSCFString*y NSTaggedPointerString*
objective-c nsstring (2)
Gran parte de la Fundación se implementa como grupos de clase . TL; DR interactúa con él como una NSString pero la base cambiará la implementación de respaldo para optimizar ciertas características de rendimiento o espacio basadas en los contenidos reales.
Si tiene curiosidad, uno de los miembros del equipo de la Fundación descargó una lista de los grupos de clases a partir de iOS 11 here
La ejecución de NSJSONSerialization en el siguiente json a veces me da NSCFString * y a veces NSTaggedPointerString * en los valores de cadena. ¿Alguien sabe por qué este es el caso y qué utiliza la serialización NSJSONS para determinar qué tipo devuelve?
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" regresa como NSTaggedPointerString *. "SALES_REPORT_VIEW" vuelve es un NSCFString *. Esto está teniendo un impacto corriente abajo donde estoy usando y lanzando los valores.
ACTUALIZAR
Esto es lo que aprendí ...
"NSTaggedPointerString resulta cuando todo el valor se puede mantener en el puntero en sí sin asignar ningún dato".
Aquí hay una explicación detallada ...
https://www.mikeash.com/pyblog/friday-qa-2015-07-31-tagged-pointer-strings.html
Dado que NSTaggedPointerString es una subclase de NSString que muestra comillas / que no muestra comillas nunca debería ser un problema para mí, ya que se usan los datos.
Gracias a todos los que comentaron. Estoy cómodo. Entiendo lo que está haciendo NSJSONSialialization.
Lo solucioné con el uso de "MUTABLECOPY"
Tuve el mismo problema. Para algunos mecanismos de "rendimiento", aparentemente Apple utiliza NSTaggedPointerString para cadenas "bien conocidas" como "California", pero esto podría ser un problema, ya que por alguna extraña razón, la serialización NSJSONS no agrega las comillas alrededor de este tipo de cadenas NSTaggedPointerString. El trabajo alrededor es simple:
NSString *taggedString = @"California";
[data setObject:[taggedString mutableCopy] forKey:@"state"]
Funciona de maravilla.