+[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 будет вызывать освобождение непосредственно перед завершением функции, поэтому, если вы не сохранили его где-то в методе, вы можете быть уверены, что строка уничтожена в конце вызова функции. Это дает вам более жесткий контроль над управлением памятью по сравнению с использованием автоматически выпущенных объектов.