2015-10-13 11 views
14

L'esecuzione di NSJSONSerialization sul seguente json a volte mi dà NSCFString * e talvolta NSTaggedPointerString * su valori stringa. Qualcuno sa perché questo è il caso e cosa usa NSJSONSerialization per determinare quale tipo restituisce?NSJSONSerializzazione che genera NSCFString * e NSTaggedPointerString *

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" torna come NSTaggedPointerString *. "SALES_REPORT_VIEW" ritorna è un NSCFString *. Questo sta avendo un impatto a valle dove sto usando e gettando i valori.

UPDATE

Ecco quello che ho imparato ...

"NSTaggedPointerString risulta quando l'intero valore può essere conservato in puntatore stesso senza allocare i dati."

C'è una spiegazione dettagliata qui ...

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

Dal NSTaggedPointerString è una sottoclasse di NSString mostrando citazioni/non mostrano citazioni dovrebbero mai stato un problema per me come vengono utilizzati i dati.

Grazie per tutti quelli che hanno commentato. Sto bene capisco cosa sta facendo NSJSONSerialization.

+1

Che cosa stai facendo che si fa la differenza? Ottieni sempre un NSString *. Quale sottoclasse di NSString * non dovrebbe mai importarti. – gnasher729

+2

Google per NSTaggedPointerString. Se questo fa la differenza per te, allora stai facendo qualcosa di molto, molto sbagliato. Puntatori con tag sono molto comuni su sistemi a 64 bit per valori piccoli in cui l'intero valore può essere mantenuto nel puntatore stesso senza allocare alcun dato. – gnasher729

+0

Un esempio è che quando viene visualizzato nell'interfaccia utente (scritto in un campo UIText), NSTaggedPointerString * non ha virgolette attorno mentre NSString * ha delle virgolette intorno. –

risposta

0

Gran parte di Foundation è implementata come class clusters. TL; DR interagisci con esso come NSString ma fondamentalmente cambierà l'implementazione del backing per ottimizzare determinate caratteristiche di prestazioni o spazio in base ai contenuti effettivi.

Se siete curiosi di uno dei team Fondazione oggetto di dumping un elenco dei cluster di classe come di iOS 11 here

Problemi correlati