iOS: разные подходы к конвертации NSString в NSData - PullRequest
3 голосов
/ 27 февраля 2012

Существуют различные подходы преобразования NSString в NSData.

NSString *req_string = @"I am a NSString.";
NSData *req_data = [NSData dataWithBytes:[req_string UTF8String] length:[req_string length]];
// or
NSData *req_data_alt = [req_string dataUsingEncoding:NSUTF8StringEncoding];

Есть ли разница между этими двумя подходами?

Ответы [ 2 ]

6 голосов
/ 27 февраля 2012

Последний вариант (NSData * data = [string dataUsingEncoding:NSUTF8StringEncoding]) - это вариант, который я бы рекомендовал.

Почему?

Некоторые люди скажут эффективность. В этом случае использование метода экземпляра строки для создания объекта NSData требует только одной отправки сообщения obj-c в код Apple, что сильно оптимизировано. В другом случае (создание нового объекта NSData с использованием метода класса) потребуется 2 отправки сообщений вашему строковому объекту и 1 отправка сообщения объекту класса NSData.

Однако время выполнения вряд ли будет сильно отличаться, и даже если они это сделают, стоимость кодирования будет зависеть от длины строки, а не от того, какие методы вы используете для создания объекта NSData.

Я бы сказал, что реальная причина, по которой вы хотите использовать метод экземпляра в NSString, это семантика и ясность.

Давайте рассмотрим псевдо-английский перевод этих опций:

  • [string DataUsingEncoding:NSUTF8StringEncoding]: Привет, строка, я хочу, чтобы ты дал мне копию своего NSData, используя кодировку UTF8. Хорошо, спасибо, поместите это прямо там - нет, не на ковер.
  • [NSData dataWithBytes:[req_string UTF8String] length:[req_string length]]: Строка! Дай мне все свои байты UTF8. да, мне тоже нужна твоя длина Sec. NSData, иди сюда, мне нужно, чтобы ты взял эту цепочку вещей, оставленную на моем пороге, и превратил ее в объект данных, строка, подожди, осторожно! Ничего не ломай "

Что тебе кажется более понятным?

4 голосов
/ 27 февраля 2012

Ваш первый звонок неверен.[req_string length] не обязательно является длиной в байтах его -UTF8String.Вы должны использовать strlen, чтобы получить реальную длину -UTF8String.

Этот пример показывает, что использование -[NSString dataUsingEncoding:] лучше - есть один параметр меньше, чтобы ошибиться.

Также обратите внимание: документы для -[NSString dataUsingEncoding:] указывают, что возвращаемые данные являются «внешним представлением», предназначенным для передачи на другие машины, которые могут включать в себя спецификацию (маркер порядка байтов) на передней панели.На практике спецификация хуже, чем бесполезная для UTF8, поэтому -dataUsingEncoding: не включает ее.Если вы выберете другую кодировку, вы можете ее увидеть.

...