Плюсы и минусы использования [NSString stringWithString: @ "some string"] против @ "some string" - PullRequest
2 голосов
/ 26 ноября 2011

Я хочу сравнить следующие простые задания:

...
@property(nonatomic,retain) UITextField *textField;
...

self.textField.text = @"some string";
self.textField.text = [NSString stringWithString:@"some string"];
self.textField.text = [NSString stringWithFormat:@"some string"];

Где textField - это UITextField, а свойство text - NSString. Конечно, все они работают. Я знаю разницу между двумя последними при использовании параметров. Но допустим, что мы заинтересованы только в этом использовании.

ВОПРОСЫ:

  1. Для выполнения этого вида задания, почему я не должен всегда использовать первое?
  2. Сравнивая последние два, есть ли разница для компиляции и / или времени выполнения этих двух? И зачем вообще использовать stringWithString:, если нет?

Ответы [ 4 ]

12 голосов
/ 26 ноября 2011

Всегда старайтесь делать то, что кажется естественным.Если вы назначаете постоянную строку, то сделайте это, то есть первый вариант.Строки @"..." являются очень эффективными константами, которым не нужно управлять памятью, поэтому используйте их, если это имеет смысл.

NSLog(@"%p", @"XX");
NSLog(@"%p", @"XX");
NSLog(@"%p", @"XX");

Результат:

0xa2424
0xa2424
0xa2424

т.е. все они являются одним и тем же объектом в памяти.

NSLog(@"%p", [NSString stringWithString:@"XX"]);
NSLog(@"%p", @"XX");
NSLog(@"%p", [NSString stringWithString:@"XX"]);

Также приводит к:

0xa2424
0xa2424
0xa2424

Как вы можете видеть из этого, нет никакой разницы между двумя объектами, поэтому использование -stringWithString: - это просто дополнительное сообщение для отправки.Сказав это, накладные расходы обычно не достаточно велики, чтобы иметь значение, так что в любом случае это не должно быть большим делом.Лично я бы пошел с методом один, поскольку использование метода два не имеет смысла, это просто дополнительный код.

Однако

NSLog(@"%p", [NSString stringWithFormat:@"XX"]);
NSLog(@"%p", [NSString stringWithFormat:@"XX"]);
NSLog(@"%p", [NSString stringWithFormat:@"XX"]);

Результат:

0x7f86730
0xf8479b0
0x8a4cdb0

Как видите, новая строка создается каждый раз, так как предоставленная вами строка является просто строкой формата, используемой для обработки следующих переменных подстановки, поскольку у вас нет ни одной строки, исключающей stringWithFormat:, если она вам не нужна.

(Очевидно, все адреса являются примерами ...)

6 голосов
/ 26 ноября 2011

Для выполнения этого вида задания, почему я не должен всегда использовать первое?

Для такого назначения вы всегда будете использовать первое, а не последнеедва.

почему я должен использовать stringWithString: вообще если нет?

Ваша интуиция верна.В большинстве случаев -stringWithString: имеет сомнительную ценность.Он в первую очередь предназначен для использования с NSMutableString, который является подклассом NSString.

Например:

NSMutableString* myString = [NSMutableString stringWithString:@"Foo"];
[myString appendString:@"Bar"];

Вы также можете использовать его, если хотите преобразовать NSMutableString вNSString или иным образом убедитесь, что вы имеете дело с экземпляром NSString.Например:

- (void):setMyString:(NSString*)newString 
{
    [_myString release];
    _myString = [[NSString stringWithString:newString] retain];
}

Это один из способов убедиться, что ивар _myString указывает на экземпляр NSString, а не на экземпляр NSMutableString.И экземпляр newString копируется только при необходимости.

Однако большинство разработчиков просто используют _myString = [newString copy]; в этом случае.

4 голосов
/ 26 ноября 2011

Для выполнения этого вида задания, почему я не должен всегда использовать первое?

Вы должны всегда использовать первое в описываемой вами ситуации. Во втором и третьем случаях возможно копирование константной строки, но свойство text UITextField в любом случае указывается как копирование предоставленной строки. Нет смысла делать копию константной строки только для того, чтобы -setText: UITextField мог скопировать эту копию.

Сравнивая последние два, есть ли разница для и / или время выполнения этих двух? И почему я должен использовать stringWithString: в все если нет?

Насколько я понимаю, -stringWithFormat: всегда будет создавать новую строку, в то время как -stringWithString: может не (вероятно, не) для константной строки. Результаты HyperCrypt выше довольно показательны в этом отношении; если вы хотите больше узнать об этом, вы можете попробовать тот же тест с изменяемой строкой.

0 голосов
/ 26 ноября 2011

Я не думаю, что это имеет значение, если вы используете первое или второе для строк.Однако обычно я использую вторую.

В случае второй и третьей, если у вас есть другая переменная, которую вы хотели бы включить в вашу строку, тогда вы используете строку stringWithFormat.В противном случае используйте stringWithString.

int number = 5;

NSString *str = [NSString stringWithFormat:@"Number is: %i", number];

// Str is "Number is: 5"

Ситуация, в которой вы будете использовать stringWithString:

NSString *myName = [NSString stringWithString:@"FN LN"];

// myName is "FN LN"

Вы должны использовать последнее, когда у вас нет других переменных для включения в строку.

Кроме того, на этот вопрос отвечали бесчисленное количество раз в других местах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...