NSJSONSerialization генерирует NSCFString * и NSTaggedPointerString *
Выполнение NSJSONSerialization в следующем json иногда дает мне 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"
}
]
}
}
}
}
"ВХОД" возвращается как 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
Большая часть Foundation реализована как кластер классов. TL; DR вы взаимодействуете с ним как NSString, но фундамент изменит реализацию поддержки, чтобы оптимизировать определенные характеристики производительности или пространства на основе фактического содержимого.
Если вам любопытно, что одна из сотрудников Фонда сбросила список кластеров классов с iOS 11 здесь