Последний вариант (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, иди сюда, мне нужно, чтобы ты взял эту цепочку вещей, оставленную на моем пороге, и превратил ее в объект данных, строка, подожди, осторожно! Ничего не ломай "
Что тебе кажется более понятным?