2015-10-13 12 views
14

次のjsonでNSJSONSerializationを実行すると、文字列値にNSCFString *とNSTaggedPointerString *が渡されることがあります。 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は全体の値が任意のデータを割り当てずに、ポインタ自体に保つことができる場合に生じます。」データが使用されているよう

NSTaggedPointerStringが/引用符を引用符を示すのNSStringのサブクラスで表示されていないのであり、ここで詳細な説明は...だ

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

は私にとって問題ではありません。

コメントありがとうございました。私はNSJSONSerializationがやっていることを理解しています。

+1

のように、クラスクラスタのリストをダンプ?あなたは常にNSString *を取得します。 NSString *のどのサブクラスであってもあなたに関係するべきではありません。 – gnasher729

+2

Google for NSTaggedPointerString。これがあなたに差をつけたら、あなたは非常に間違ったことをしています。タグ付きポインタは、64ビットシステムでは、小さな値に対して非常に一般的です。ここでは、データ全体を割り当てずに値全体をポインタ自体に保持できます。 – gnasher729

+0

1つの例として、UITextFieldに書き込まれたUIで表示すると、NSTaggedPointerString *の周りに引用符が付きませんが、NSString *には引用符が付いています。 –

答えて

0

多くの財団はclass clustersとして実装されています。 TL;あなたはNSStringとしてそれと対話しますが、基盤は実際の内容に基づいて特定のパフォーマンスやスペース特性を最適化するためにバッキング実装を変更します。

あなたが興味があれば財団チームの一つは、あなたが、それは違いを作ることを何をしているiOSの11 here

関連する問題