Является ли NSMutableString в этом случае более эффективным, чем NSString? - PullRequest
2 голосов
/ 01 апреля 2009

Если я объявлю переменную-указатель таким образом:

NSString *foo;

А потом где-то позже в моем коде сделать что-то вроде:

foo = @"bar";

Это в конечном итоге берет мою NSString, создает новую копию в памяти с дополнительной строкой, а затем удаляет мою исходную строку? Будет ли Foo лучше использовать NSMutableString?

Ответы [ 2 ]

9 голосов
/ 01 апреля 2009

Нет, 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, когда закончите с ней.

5 голосов
/ 01 апреля 2009

Нет. @ "Bar" в вашем примере является строковой константой и должна быть вставлена ​​в ваш код. Вам не нужно беспокоиться о распределении / освобождении памяти с этой константой.

NSMutableString более эффективно использовать, когда вы делаете много маленьких манипуляций со строкой (добавление подстрок и т. Д.), И вы не хотите продолжать распределять автоматически выпущенные строки NSStrings повсеместно. Я стараюсь избегать автоматического освобождения строк в iPhone, если могу, из-за проблем с памятью внутри циклов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...