Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

У вас может быть 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];

но вы владеете копией и должны освободить или автообновить ее.

Ответ 2

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

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

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

(Взято из здесь)

Ответ 3

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

[NSString stringWithString:@"some string"]

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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