2015-10-13 106 views
14

在下面的json上執行NSJSONSerialization有時會給我NSCFString *,有時會給字符串值帶上NSTaggedPointerString *。有誰知道爲什麼會出現這種情況,以及NSJSONSerialization用於確定返回哪種類型?NSJSONSerialization生成NSCFString *和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」作爲NSTaggedPointerString *返回。 「SALES_REPORT_VIEW」返回是一個NSCFString *。這對我正在使用和投射值的下游產生影響。

UPDATE

這裏就是我了...

「NSTaggedPointerString結果時,整個價值可以保持在指針本身沒有分配任何數據。」

這裏有一個詳細的解釋...

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

由於NSTaggedPointerString是的NSString的報價顯示的子類/隨着數據使用沒有顯示行情應該從來都不是我的問題。

感謝大家的評論。我很舒服我明白NSJSONSerialization在做什麼。

+1

你在做什麼,它有差別的類集羣的列表?你總是得到一個NSString *。 NSString *的哪個子類不應該對你有影響。 – gnasher729

+2

Google for NSTaggedPointerString。如果這對你有所作爲,那麼你正在做一些非常非常錯誤的事情。帶標記的指針在64位系統上對於小數值很常見,其中整個值可以保存在指針本身中而不分配任何數據。 – gnasher729

+0

一個例子是,當在UI中顯示(寫入UITextField)時,NSTaggedPointerString *周圍沒有引號,而NSString *確實有引號。 –

回答

0

許多基金會實施爲class clusters。 TL; DR與NSString進行交互,但基礎會根據實際內容更改後臺實現,以針對某些性能或空間特性進行優化。

如果你是好奇基金會的球隊之一傾銷作爲iOS的11 here