Что лучше добавить строку CString, чем строку ObjC? - PullRequest
3 голосов
/ 15 октября 2011

Я пишу немного кода, выполняющего манипуляции со строками.В этой конкретной ситуации добавление «? PartnerId = 30» к URL-адресу для ссылки на партнерскую программу iTunes.Это необработанная строка и полностью статическая.Я думал, что лучше сделать:

urlString = [urlString stringByAppendingFormat:@"%@", @"?partnerId=30"];

Или:

urlString = [urlString stringByAppendingFormat:@"%s", "?partnerId=30"];

Я думаю, что лучше не создавать экземпляр всего объекта Objective C, но я никогдавидел, как это было сделано.

Ответы [ 3 ]

4 голосов
/ 15 октября 2011

Строка, объявленная с использованием синтаксиса @ "", является константой и уже будет существовать в памяти к моменту запуска вашего кода, поэтому при их использовании штраф за выделение ресурсов отсутствует.

Вы можете обнаружить, что они очень незначительныебыстрее, так как они знают свою собственную длину, в то время как строки C нужно проходить через петлю, чтобы узнать их длину.

Благодаря этому вы получите более ощутимое улучшение производительности (хотя и незначительное), если не использовать строку формата:

urlString = [urlString stringByAppendingString:@"?partnerId=30"];
3 голосов
/ 15 октября 2011

И литеральные строки C, и литеральные строки NSS выражаются как постоянные биты памяти. Ни один не требует выделения на использование.

1 голос
/ 16 октября 2011

Строковые литералы Objective-C являются бессмертными объектами. Они создаются, когда ваш двоичный файл загружен в память. С этим знанием прежняя форма не создает временную NSString.

Я, честно говоря, не знаю , который быстрее в целом , потому что это также зависит от внешних условий; NSString может представлять строки нескольких кодировок (по умолчанию UTF-16), если urlString имеет преобразование кодирования для выполнения, то это может быть ударом производительности для подхода или . В любом случае, они оба будут довольно быстрыми - я не стал бы беспокоиться об этом случае, если у вас не будет много (например, тысяч) таких для создания, и это критично ко времени, потому что их производительность должна быть одинаковой.

Поскольку вы используете форму: NSString = NSString+NSString, литерал NSString может быть быстрее для нетривиальных случаев, поскольку длина сохраняется с объектом, а кодировки обеих строк могут уже соответствовать строке назначения. Строка C, используемая в вашем примере, также будет тривиальной для преобразования в другую кодировку, плюс она короткая.

C-строки, как более примитивный тип, могут сократить время загрузки и / или использование памяти, если вам нужно определить lot из них.

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

Если вам нужно также представление строки C для заданного набора литералов, то вы можете определить строковые литералы C. Определение строковых литералов Си также может заставить вас создавать временные NSString s на основе строк Си. В этом случае вы можете определить один для каждого варианта или использовать API-интерфейсы CFString 'create CFString с внешним буфером'. Опять же, это было бы для очень необычных случаев (микрооптимизация, если вы действительно не проходите через огромные наборы этих строк).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...