выделить строку и дать значение непосредственно - PullRequest
1 голос
/ 11 ноября 2010

Может ли кто-нибудь сказать разницу между:

NSString* myStr = @"Some value";

и

NSString* myStr = [[NSString alloc] initWithString:@""];

почему я должен выделять строку, даже если я могу дать какое-то значение напрямую ..?

Ответы [ 3 ]

2 голосов
/ 11 ноября 2010

Из Apple Руководство по программированию строк , " Создание строк "

Самый простой способ создать строковый объект в исходном коде - использовать конструкцию Objective-C @ "...":

  NSString *temp = @"/tmp/scratch";

Обратите внимание, что при создании строковой константы таким способом вам следует избегать использования чего-либо, кроме 7-битных символов ASCII. Такой объект создается во время компиляции и существует во время выполнения вашей программы. Компилятор делает такие объектные константы уникальными для каждого модуля, и они никогда не освобождаются, хотя вы можете сохранить и освободить их, как и любой другой объект.

«Компилятор делает такие объектные константы уникальными [...]» предполагает, что строковые литералы интернированы для каждого модуля. Насколько я знаю, интернирование и время жизни объекта и управление памятью являются основными различиями между этими двумя подходами.

Что касается того, почему можно использовать последнее, если по какой-то причине вы хотите, чтобы myStr не была уникальной интернированной строкой, то вы можете попробовать подход -initWithString:, хотя интернированная строка все еще существует, используя -copy будет проще (как указывает NR4TR) и (как Юджи отмечает в комментариях) результирующая строка, вероятно, будет точно такой же, что и строковый литерал, несмотря на то, что предлагает документация Apple.

2 голосов
/ 11 ноября 2010

Предположим, вы хотите сохранить передаваемую строку в точности так, как это было при передаче:

@implementation AddressCard;

-(NSString *) name
{
   return name;
}

-(void) setName: (NSString *) theName
{
   [name release];
   name = [[NSString alloc] initWthString: theName];
}

//rest of class implementation code snipped
@end

Если вы используете только

-(void) setName: (NSString *) theName
{
   [name release];
   name = [theName retain];
}

, тогдаNSMutableString, которое передается как имя, может быть изменено позже, без явной установки свойства name в AddressCard.Часто это не то, что нужно.

0 голосов
/ 11 ноября 2010

Все дело в управлении памятью, поэтому, если вы напишите

NSString * myStr = @ "Некоторое значение";

назначит строковое значение для некоторого ресурса, и в конце памяти скрипта произойдет автоматическое освобождение, где, как во втором случае

NSString * myStr = [[NSString alloc] initWithString: @ ""];

Вы назначаете некоторую память, и после использования этой переменной вы можете освободить память переменной. Следовательно, вы сами управляете памятью. Так что вероятность утечки памяти во втором случае меньше. Первый случай зависит исключительно от сборки мусора, которая не очень надежна для этого языка.

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