Использование объектов NSString и NSMutableString в Objective C - PullRequest
1 голос
/ 04 июля 2011

Мне нужно использовать кучу строковых переменных в моей программе.Я переназначаю некоторые из них довольно часто, в то время как другие застряли с одинаковым значением во время выполнения.Какова лучшая практика здесь?

В первом случае переменные должны быть NSMutableString, и я должен привести их к NSString (используя метод копирования) всякий раз, когда они должны быть аргументами функций, которые требуют NSString предметов.Это правильно?

Когда я переназначаю их на другие постоянные значения, мне не нужно избавляться от предыдущего содержимого, верно?

Что касается NSString объектов, если мне нужно назначитьновое значение для них, я думаю, я должен освободить их, распределить их снова, а затем назначить новое значение.Это правильно?

Ответы [ 3 ]

6 голосов
/ 04 июля 2011

Если вы на самом деле не изменяете строку, вы не должны использовать 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 только при изменении самой строки. Но вы можете изменить переменную как с изменяемыми, так и с неизменяемыми строками без проблем компилятора или времени выполнения (если не считать управление памятью, но большая часть его все равно автоматически освобождается).

1 голос
/ 04 июля 2011

Отличие только между NSMutableString * и NSString * заключается в том, что изменяемая строка может быть изменена. Вам не нужно ничего разыгрывать, так как NSMutableString является подклассом NSString или не использует различные меры памяти (поэтому вы правы *).

Если вам нужна модифицируемая версия строки, вы просто делаете

NSMutableString * myMutableString = [NSMutableString stringWithString: myString];

Вы не должны ничего копировать.

Обратите внимание, что если вы позвоните:

NSString* myString = myMutableString;

myString по-прежнему является изменяемой строкой.

Так что, если по какой-либо причине (из-за безопасности ...) вам действительно нужны неизменяемые строки, вы должны позвонить

NSString* myString = [NSString stringWithString:myMutableString];

* вы правы, но вы также можете вызвать [replaceCharactersInRange: withString:] для изменяемой строки. если в предыдущем выделении достаточно места, то это может быть быстрее, поскольку не требуется уничтожения и нового выделения.

(добавлено позже: забыл setString: метод)

1 голос
/ 04 июля 2011

Что касается объектов NSString, если мне нужно назначить им новое значение, я думаю, что я должен освободить их, распределить их снова, а затем назначить новое значение.Это правильно?

Вы не освобождаете NSString, если вы не выделяли его ранее, как здесь:

NSString *string = [NSString stringWithFormat:@"Hello"];

Вам нужно только освободить его, когда вы вызываете alloc:

NSString *string = [[NSString alloc] initWithString:@"Hello"];
[string release];
...