+ [NSString stringWithString:] - какой смысл? - PullRequest
17 голосов
/ 24 октября 2009

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

Я получаю утилиту при использовании с NSMutableString, я просто не видел утилиту с классом NSString.

Ответы [ 7 ]

21 голосов
/ 24 октября 2009

Возможно, у вас есть 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];

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

9 голосов
/ 24 октября 2009

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

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

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

(взято с здесь )

1 голос
/ 24 октября 2009

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

1 голос
/ 24 октября 2009

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

1 голос
/ 24 октября 2009

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

[NSString stringWithString:@"some string"]

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

[[[NSString alloc] initWithString:@"some string"] autorelease]
0 голосов
/ 23 мая 2012

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

0 голосов
/ 24 октября 2009

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

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