@ «Моя строка» - это буквенная строка, скомпилированная в двоичный файл. При загрузке он имеет место в памяти. Первая строка объявляет переменную, которая указывает на эту точку в памяти.
Из руководства по программированию строки:
Самый простой способ создать строковый объект в исходном коде - это использовать
конструкция Objective-C @ "...":
NSString *temp = @"/tmp/scratch";
Обратите внимание, что при создании строки
таким образом, вы должны избегать использования чего-либо, кроме 7-битного
Символы ASCII. Такой объект создается во время компиляции и существует
на протяжении всего выполнения вашей программы. Компилятор делает такой объект
константы уникальны для каждого модуля и никогда не освобождаются,
хотя вы можете сохранить и освободить их, как и любой другой объект.
Вторая строка выделяет строку, беря эту буквальную строку. Обратите внимание, что обе строки @ "My String" одинаковы. Чтобы доказать это:
NSString *str = @"My String";
NSLog(@"%@ (%p)", str, str);
NSString *str2 = [[NSString alloc] initWithString:@"My String"];
NSLog(@"%@ (%p)", str2, str2);
NSString *copy = [str2 stringByAppendingString:@"2"];
NSLog(@"%@ (%p)", copy, copy);
Выводит тот же адрес памяти:
2011-11-07 07:11:26.172 Craplet[5433:707] My String (0x100002268)
2011-11-07 07:11:26.174 Craplet[5433:707] My String (0x100002268)
2011-11-07 07:11:26.174 Craplet[5433:707] My String2 (0x1003002a0)
То, что говорят, это не только первые две строки с одним и тем же адресом памяти, но если вы не измените код, это один и тот же адрес памяти при каждом запуске. Это то же двоичное смещение в памяти. Но копия не только отличается, но и меняется каждый раз, когда вы ее запускаете, поскольку она размещается в куче.
Авторелиз не оказывает влияния в соответствии с приведенным выше документом. Вы можете освободить их, но они никогда не освобождаются. Таким образом, они равны не потому, что оба являются автоматически выдаваемой строкой, а в том, что они оба являются константами, а выпуск игнорируется.