Если вы на самом деле не изменяете строку, вы не должны использовать NSMutableString
. Вы переназначаете всю строку на новое значение, поэтому оставайтесь с обычным NSString
. Используйте автоматически выпущенные версии, потому что это будет эффективнее, чем alloc / init / release. Вы также можете просто переназначить свои строки константам, если знаете, на что они будут назначены.
В первом случае переменные должны быть NSMutableString, и я должен приводить их к NSString (используя метод copy) всякий раз, когда они должны быть аргументами функций, которые требуют объектов NSString. Это верно?
Ну, вы могли бы сделать это таким образом, но это было бы действительно неэффективно. Помните, что наследование - NSMutableString
- это и NSString
, только с некоторыми новыми элементами. Простой бросок сделает свое дело:
NSString *string = (NSString *)aMutableString;
Даже лучше, вам даже не нужно этого делать. Из-за наследования вы можете напрямую передавать изменяемую строку везде, где требуется обычная строка, не требуется приведение. В этом красота наследства.
Когда я переназначаю их другим постоянным значениям, мне не нужно избавляться от предыдущего содержимого, верно
Не для изменяемых или неизменяемых строк. Старые значения просто перезаписываются в памяти - там нечего утилизировать. Что касается управления памятью, то на самом деле неэффективно постоянно создавать новые строки. Просто переназначить их. Вам никогда не нужно будет alloc
/ init
одна строка более одного раза, и этот единственный init
должен быть сбалансирован одним release
.
Приложение: Когда следует использовать Mutable?
Изменяемая строка должна использоваться, когда вы физически изменяете значение существующей строки, не отказываясь полностью от старого значения. Примеры могут включать добавление символа в начало или конец или изменение символа в середине. С изменяемой строкой вы можете сделать это «на месте» - вы просто измените существующую строку. Напротив, неизменяемая строка после установки ее значения не может изменить это значение . У NSString
есть такие методы, как stringByAppendingString:
, который добавляет строку к существующей - , но возвращает новую строку . За кадром NSString
скопировал вашу старую строку в новую (большую) область памяти, добавил аргумент и возвратил новую строку. Это копирование намного менее эффективно (условно говоря, или если вам приходится много делать).
Конечно, ничто не мешает вам физически назначать одну строку другой. Старые значения будут перезаписаны. Большинство NSString
с, включая @"String Constants"
, выпускаются автоматически. Если вы создаете новую строку и решаете выделить / инициализировать, вы можете присвоить ей другое значение без последствий:
myString = anotherString;
myString = myTextField.text;
Вы можете сделать это как с изменяемыми, так и с неизменяемыми строками. Основной вывод заключается в том, что вы должны использовать mutable только при изменении самой строки. Но вы можете изменить переменную как с изменяемыми, так и с неизменяемыми строками без проблем компилятора или времени выполнения (если не считать управление памятью, но большая часть его все равно автоматически освобождается).