"stringWithString" против "alloc ... initWithString ... autorelease" - PullRequest
3 голосов
/ 11 января 2009

Я видел, что утверждалось, что следующее "в значительной степени эквивалентно":

foo([NSString stringWithString:@"blah"])                       # version 1
foo([[[NSString alloc] initWithString:@"blah"] autorelease])   # version 2

Вышесказанное на самом деле буквально эквивалентно или есть какие-то тонкие различия? Какие причины предпочитают один или другой?

Ответы [ 4 ]

8 голосов
/ 11 января 2009

Они эквивалентны, но я предпочитаю "stringWithString", так как он более краткий.

7 голосов
/ 11 января 2009

Эти два функционально эквивалентны, но, как отмечает rpetrich, могут работать внутри системы немного иначе. Это не должно иметь значения для вас, используйте то, что кажется вам более удобным. Более того, хотя разница в производительности незначительна, на практике это вряд ли будет иметь значение для вашего приложения.

Но все это упускает важный момент: оба бессмысленны. Написав @ "foo", вы уже имеете полностью функциональный объект NSString. Нет необходимости возиться с дополнительными методами для дублирования строки; это проще и быстрее сделать:

foo(@"blah")
5 голосов
/ 11 января 2009

В большинстве случаев единственным отличием является дополнительный звонок на objc_msgSend.

Декомпиляция NSString показывает, что вместо отправки +alloc она отправляет +allocWithZone:NSDefaultMallocZone()

4 голосов
/ 11 января 2009

Методы, такие как + stringWithString: или + array, являются просто вспомогательными методами, которые всегда возвращают автоматически выпущенные объекты. Они в основном используются для уменьшения объема кода, написанного для часто создаваемых классов, таких как строки, массивы, словари, числа и т. Д. Они строго следуют основным правилам управления памятью, из которых взято то, которое я упомянул выше.

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