NSString
s интересны тем, что до недавнего времени они были единственным типом объекта Objective-C, который мог быть представлен как литерал.Блочные объекты, добавленные в iOS 4 и OS X 10.6, являются еще одним недавним дополнением, о котором я знаю, но у них есть свои особые правила, поэтому я упоминаю, что только для полноты. Примитивы C
могут храниться накуча или в стеке.Например:
- (void)someMethod
{
int i = 3; // i is on the stack
}
- (void)someOtherMethod
{
int *i = (int *)malloc(sizeof(int)); // i now points to an 'int' on the heap
}
Большинство объектов Objective C могут храниться только в куче.Вы совершенно правы, когда говорите, что alloc
предоставляет новую копию объекта в куче, и результатом вашего вызова myString
будет указатель на строку NSSt в куче.
Тем не менее, синтаксис @""
является сокращением для создания объекта.@"Value"
фактически создает литерал объекта.Так, например, вы можете сделать:
NSLog(@"%@", [@"Value" substringFromIndex:1]);
И вывод будет 'alue'.Вы можете отправить сообщение substringFromIndex:
на @"Value"
, потому что это буквальный объект.
То, что NSString
делает с initWithString:
, зависит от конкретной реализации, но вы можете быть уверены, что для этого потребуется копиявещь указала, если это необходимо.В противном случае вы бы увидели странное поведение, если бы сделали что-то вроде этого:
NSMutableString *mutableString = [NSMutableString stringWithString:@"String"];
NSString *immutableString = [NSString stringWithString:mutableString];
[mutableString appendString:@" + hat"];
// immutableString would now have mutated if it was simply
// keeping a reference to the string passed in
Поэтому вам не нужно беспокоиться о сроке службы всего, что вы ему передаете.Это работа NSString
, чтобы справиться с этим.
На практике, NSString
литералы объекта фактически никогда не истекают, поэтому вопрос немного спорный.Однако, если бы вы использовали initWithUTF8String:
или что-то еще, которое принимает литерал C, и этот литерал C был в стеке, вам все равно не о чем беспокоиться, потому что NSString
с этим справится.
В ответ на ваш второй вопрос я бы предпочел вторую версию на том основании, что она короче и, следовательно, более четко демонстрирует, что вы намерены делать.У последних есть некоторые теоретические преимущества в производительности, особенно если вы используете один и тот же литерал в нескольких местах, но они настолько невероятно незначительны, что их не стоит рассматривать в наши дни.