Это какая-то оптимизация компилятора?
Не совсем.Это значение особого случая для константы, и оптимизация общего конкретного неизменяемого типа / значения, которая была реализована классом NSString
.
NSString
является неизменной.Нет причины, по которой необходимо несколько экземпляров одной и той же пустой строки.В таких простых случаях -[NSString init]
может принимать форму:
static NSString* const EmptyNSString = @"";
- (id)init
{
self = [super init];
[self release];
return EmptyNSString;
}
аналогично, + [NSString string]
:
+ (id)string
{
return EmptyNSString;
}
Таким образом, существует несколько статических неизменяемых объектов, которые используются таким образомгде это имеет смысл.Другие очевидные примеры включают + [NSArray array]
и + [NSNumber numberWithBool:]
.
Каждая из этих констант может представлять то, что было бы много-много тысяч уникальных распределений, созданных во время выполнения вашей программы.
Это происходитработать, потому что NSString
как кластер классов: Вам возвращается объект одного из многих непрозрачных типов, который реализует интерфейс, объявленный NSString
.Следовательно, тип NSMutableString
может затем реализовать init
надлежащим образом:
- (id)init
{
self = [super init];
if (nil != self) { ... }
return self;
}
Наконец, почти во всех случаях вы должны объявить свои свойства NSString
как copy
.