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"
              }
            ]
          }
        }
      }
    }

«LOGIN» возвращается как NSTaggedPointerString*. "SALES_REPORT_VIEW" возвращается как NSCFString*. Это оказывает влияние на последующие процессы, когда я использую и привожу значения.

ОБНОВЛЕНИЕ

Вот что я узнал...

«NSTaggedPointerString возникает, когда все значение может храниться в самом указателе без выделения каких-либо данных».

Здесь есть подробное объяснение...

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

Поскольку NSTaggedPointerString является подклассом NSString, отображение кавычек/не отображение кавычек никогда не должно быть проблемой для меня, поскольку данные используются.

Спасибо всем, кто прокомментировал. Мне удобно, я понимаю, что делает NSJSONSerialization.


person Justin Domnitz    schedule 13.10.2015    source источник
comment
Что вы делаете, что это имеет значение? Вы всегда получаете NSString*. Какой подкласс NSString* для вас не имеет значения.   -  person gnasher729    schedule 13.10.2015
comment
Google для NSTaggedPointerString. Если это имеет значение для вас, то вы делаете что-то очень, очень неправильно. Теговые указатели очень распространены в 64-битных системах для небольших значений, где все значение может храниться в самом указателе без выделения каких-либо данных.   -  person gnasher729    schedule 13.10.2015
comment
Одним из примеров является то, что при отображении в пользовательском интерфейсе (записанном в UITextField) NSTaggedPointerString* не заключен в кавычки, а NSString* заключен в кавычки.   -  person Justin Domnitz    schedule 13.10.2015
comment
@Justin Domnitz Я не верю, что вы на правильном пути, пожалуйста, добавьте пример того, как вы используете значения или их типы.   -  person A-Live    schedule 13.10.2015
comment
Я думаю, что мы немного сбились с пути. :) Я действительно просто пытаюсь понять результаты, которые я получаю от NSJSONSerialization. Лучший ответ, кажется, от gnasher729 в ​​отношении системы, определяющей, что NSTaggedPointerString получается, когда все значение может храниться в самом указателе без выделения каких-либо данных. Может ли кто-нибудь указать мне на документацию по этому вопросу? Google не дает ничего полезного (поэтому я разместил вопрос здесь).   -  person Justin Domnitz    schedule 13.10.2015
comment
Покажите нам код. Вот как работает NSJSONSerialization для тысяч и тысяч приложений, и вы единственный, у кого есть проблема.   -  person gnasher729    schedule 13.10.2015
comment
Lol @ gnasher729 кто-то приходит в stackoverflow с вопросом, но вместо этого получает больше вопросов, отлично... Кроме того, Джастин, если вы нашли ответ, пожалуйста, создайте его и отметьте свой как ответ. Например, у меня возникают проблемы, когда NSJSONSerialization путает ключи словаря как NSTaggedPointerStrings и больше не может получить доступ к этим значениям, если они не приведены явно, что делает индексацию неприятной.   -  person Michael Lorenzo    schedule 07.04.2016


Ответы (2)



Я ИСПРАВИЛ ЭТО, ИСПОЛЬЗУЯ "MUTABLECOPY"

Я была такая же проблема. Для некоторого механизма «производительности», по-видимому, Apple использует NSTaggedPointerString для «хорошо известных» строк, таких как «California», но это может быть проблемой, поскольку по какой-то странной причине NSJSONSerialization не добавляет кавычки вокруг этого типа строк NSTaggedPointerString. Работа вокруг проста:

NSString *taggedString = @"California";
[data setObject:[taggedString mutableCopy] forKey:@"state"]

Работает как шарм.

person user2387149    schedule 27.03.2019