Потребности кодирования который должен быть указан для преобразования NSString в NSData по той же причине, которую необходимо указать для перехода от NSData к NSString.
Объект NSData является оболочкой для строки абсолютно сырых байтов. Если NSString не указывает некоторую кодировку, она не знает, что писать, потому что на уровне единиц и нулей кодировка UTF-16 отличается от кодировки UTF-8 той же буквы и, конечно же, если вы напишете UTF-16 как big-endian и прочитаете его как little-endian, вы получите тарабарщину.
Другими словами, не думайте об этом как о преобразовании или выходе из строки; это генерирует байтовый буфер, а кодировка сообщает, какие из них и нули записывать, когда следующий символ «a», а какие - писать, когда это означает «妈».
Что касается вашего вопроса ... вот мои два цента.
1) Если вы конвертируете NSString в NSData, чтобы ваша одна и та же программа могла конвертировать ее позже, и никакое другое программное обеспечение не будет иметь дело с этой NSData, пока вы не прочитаете ее обратно в NSString, тогда ничто из этого не имеет значения. Все, что имеет значение, - это то, что ваша кодировка «строка-в-данные» и ваша кодировка «данные в строку» совпадают.
2) Если вы имеете дело только с символами ASCII, вы, вероятно, можете избежать неприятностей, просто потому, что многие виды кодирования используют одно и то же представление для символов до 128. Но это легко ломается даже при небольших вещах, таких как умные кавычки.
3) Несмотря на имя, defaultCStringEncoding не является чем-то, что вы должны использовать по умолчанию. Он разработан для особых обстоятельств, когда вам нужно иметь дело с системными строками и иначе не знать, как система имеет дело со своими внутренними строками. Это относится к тому, как строки обрабатываются в реализации по умолчанию C, а не в внутренних элементах NSString, поэтому нет необходимости в производительности.
4) Если вы пишете строку с неизвестной строковой кодировкой, и вы пытаетесь ее прочитать с другой строковой кодировкой, ваш код не будет работать; во многих случаях вы просто получите пустую строку.
Подводя итог: кто будет пытаться интерпретировать ваши объекты NSData? Если это ваше собственное приложение, выберите кодировку, которая имеет смысл для вас (я использую UTF8 для всего) и использую ее для обоих преобразований. В противном случае выясните, что ваша экосистема должна читать или писать и делать это стандартом.