+[NSString stringWithString:] - какой смысл?

Как NSString Строки являются неизменяемыми, какова стоимость stringWithString: метод класса?

Я получаю утилиту при использовании с NSMutableStringЯ просто не видел утилиту с NSString учебный класс.

7 ответов

Решение

У вас может быть NSMutableString (или некоторый домашний подкласс NSString), который вы хотите продублировать.

NSMutableString *buffer = [NSMutableString string];
// do something with buffer
NSString *immutableStringToKeepAround = [NSString stringWithString:buffer];

Конечно, вы также можете просто сделать копию:

NSMutableString *buffer = [NSMutableString string];
// do something with buffer
NSString *immutableStringToKeepAround = [[buffer copy] autorelease];

но вы являетесь владельцем копии и должны выпустить или автоматически выпустить ее.

Как указывает "Энди" в #318666, это связано с управлением памятью, цитируя:

Разница между initWithString и stringWithString в том, что stringWithString возвращает автоматически освобожденный указатель. Это означает, что вам не нужно специально его выпускать, так как об этом позаботятся в следующий раз, когда пул авто-релизов очистит все автоматически выпущенные указатели.

initWithString, с другой стороны, возвращает указатель с счетом сохранения 1 - вам нужно вызвать release для этого указателя, иначе это приведет к утечке памяти.

(Взято отсюда)

Возвращает строку, созданную путем копирования символов из другой заданной строки

[NSString stringWithString:@"some string"]

Это эквивалентно

[[[NSString alloc] initWithString:@"some string"] autorelease]

В качестве другого варианта использования, если (по какой-либо причине) вы создаете свой собственный подкласс NSString или NSMutableString, stringWithString: предоставляет удобный способ для его создания с экземпляром NSString, NSMutableString или MyCustomString.

Кроме того, если у вас есть указатель на NSString, он может фактически быть подклассом NSString, таким как NSMutableString. Итак, если вы хотите сохранить строку и быть уверенным, что она не изменится, вы должны сделать ее копию, следовательно, stringWithString существует.

Я часто использую +stringWithString: когда мне нужно создать NSMutableString но начните с начального значения. Например:

NSMutableString * output = [NSMutableString stringWithString:@"<ul>"];
for (NSString * item in anArray) {
  [output appendFormat:@"<li>%@</li>", item];
}
[output appendString:@"</ul>"];

К вашему сведению, теперь, когда мы компилируем с включенным ARC, вам не нужно вообще выпускать вручную, ARC вставит вызовы освобождения во время компиляции. Так чем же он отличается? stringWithString по-прежнему добавляется в пул автоматического выпуска, который в будущем будет удален (если только вы не создали свой собственный пул автоматического выпуска). initWithString будет вызывать освобождение непосредственно перед завершением функции, поэтому, если вы не сохранили его где-то в методе, вы можете быть уверены, что строка уничтожена в конце вызова функции. Это дает вам более жесткий контроль над управлением памятью по сравнению с использованием автоматически выпущенных объектов.

Другие вопросы по тегам