Строки (NSString
экземпляры и статически размещенные строки с @""
) неизменны в Какао, поэтому при попытке создать новый NSString
из статически распределенного класса NSString
может выполнить оптимизацию: новый экземпляр NSString
не создается (объект, созданный при вызове -alloc
, немедленно освобождается), и возвращается ссылка на статически размещенную строку. То есть строка:
NSString *localString = [[[NSString alloc] initWithString:@"I don't know."] autorelease];
Фактически эквивалентно:
NSString *localString = @"I don't know.";
(Если вы проверите адреса памяти этих двух объектов, вы увидите, что они одинаковы.)
Поскольку этот тип строки не может быть освобожден, он не исчезает, когда вы ожидаете этого.
Если вы создадите свою строку способом, который не может быть оптимизирован, например:
NSString *localString = [[[NSString alloc] initWithFormat:@"%@", @"I don't know."] autorelease];
Тогда ваш код будет вести себя так, как вы ожидаете, и ваше приложение (надеюсь) будет аварийно завершено в вашей строке NSLog
.