Нет, foo
- переменная, содержащая указатель на NSString
. Присвоение foo = @"bar"
устанавливает значение, сохраненное указателем foo
, в адрес NSString @"bar"
. Копия не сделана. Если foo
уже указывал на другой экземпляр NSString
, который не был константой строки (то есть, как @"bar"
), и других ссылок на этот экземпляр нет, то у вас утечка памяти. Вы бы
[foo release];
foo = @"bar";
в этом случае. Вам не нужно сохранять или освобождать строковые константы, такие как @"bar"
.
Строковые константы не могут быть изменены, поэтому вы получите ошибку времени выполнения, если попытаетесь изменить значение константной строки. Нет разницы между назначением @"bar"
для NSString*
против NSMutableString*
. Конечно, вы не сможете использовать методы мутации NSMutableString
без ошибки времени выполнения только потому, что назначаете адрес @ "bar" (экземпляр NSString) переменной типа NSMutableString*
. Если вы хотите изменить строку, вы должны сделать
NSMutableString *mutableFoo = [@"bar" mutableCopy];
В этом случае копия явно сделана, и вы несете ответственность за выпуск mutableFoo
, когда закончите с ней.