Как NSString
строки неизменяемы, каково значение метода класса stringWithString:
?
Я получаю утилиту при использовании с NSMutableString
, я просто не видел утилиту с классом NSString
.
Как NSString
строки неизменяемы, каково значение метода класса stringWithString:
?
Я получаю утилиту при использовании с NSMutableString
, я просто не видел утилиту с классом NSString
.
У вас может быть 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, это может быть подкласс NSString, например NSMutableString. Итак, если вы хотите сохранить строку и быть уверенным, что она не изменится, вы должны сделать ее копию, поэтому существует строка stringWithString.
В качестве другого варианта использования, если (по какой-либо причине) вы создаете свой собственный подкласс NSString или NSMutableString, stringWithString:
предоставляет удобный способ создания экземпляра с экземпляром NSString, NSMutableString или MyCustomString.
Я часто использую +stringWithString:
, когда мне нужно создать NSMutableString
, но запустите его с начальным значением. Например:
NSMutableString * output = [NSMutableString stringWithString:@"<ul>"];
for (NSString * item in anArray) {
[output appendFormat:@"<li>%@</li>", item];
}
[output appendString:@"</ul>"];
FYI, теперь, когда мы компилируем ARC-совместимый, вам вообще не нужно вручную выпускать, ARC будет вставлять вызовы релиза во время компиляции. Так как же все это по-другому? stringWithString по-прежнему добавляется в пул авторесурсов, который в будущем будет истощен (если только вы не создали свой собственный пул авторесурсов). initWithString будет иметь вызов освобождения до того, как функция закончится, поэтому, если вы не сохранили его где-нибудь в методе, вы можете быть уверены, что строка будет уничтожена до конца вызова функции. Это дает вам более жесткий контроль над управлением памятью, в отличие от использования автореализованных объектов.