Самая важная вещь, которую нужно здесь убрать : оператор присваивания =
никогда не изменяет (то есть изменяет) объект. Мутирование объекта может быть достигнуто только путем отправки ему сообщений (например, отправка appendString:
на NSMutableString
). Оператор присваивания просто заставляет указатель указывать на объект, отличный от ранее.
Таким образом, неверно говорить:
(1) NSString * test = [[NSString alloc] init];
(2) test = @"msg";
Строка (1) создает объект NSString и назначает test
для указания на него. Строка (2) делает то же самое: она создает новый, не связанный объект NSString и назначает test
для указания на него. Теперь исходная строка NSString, созданная строкой (1), не имеет к ней никаких указаний и утечка.
Кроме того, вам никогда не нужно alloc
строковый литерал; компилятор делает это неявно, когда вы используете синтаксис @"..."
. В общем, вам очень редко придется использовать [NSString alloc]
вообще (только если вы хотите использовать различные init*
методы, такие как initWithFormat:
и т. Д.)
str1
будет указывать на отдельную копию тестовой строки. (Ошибка: согласно Eiko, получатель будет просто воспринимать это как «удержание», если оно неизменное. Это не имеет практического значения, если вы ведете себя правильно.)
str2
будет указывать на то же место, что и тест, и счетчик сохраняемых объектов будет увеличиваться.
str3
будет указывать на то же место, что и тест, но счет сохранения не будет увеличиваться.
Вообще говоря, строки являются неизменяемыми, поэтому вы не можете изменять их содержимое. Возможно, вам придется следить за экземплярами NSMutableString, который является подклассом NSString. Вот почему многие люди рекомендуют копировать строки вместо того, чтобы сохранять их, так что, если строка будет видоизменена другой частью программы, копия вашего объекта не будет затронута.