@ ""против [NSString string]


Я пытаюсь разобраться в плюсах и минусах @"" и [NSString string], поскольку они, по-видимому, ведут себя подобным образом. Я надеюсь, что [NSString string] возвращает статическое значение, таким образом избегая ненужного создания строк в памяти. Может ли кто-нибудь пролить некоторый свет, поскольку документация неубедительна.

6   6   2012-01-11 12:01:51

6 ответов:

Вполне вероятно, что @"" == [NSString string] и поэтому решение-это просто вопрос стиля. Ага, это не так:

NSLog(@"%i", @"" == @""); // 1
NSLog(@"%i", [NSString string] == [NSString string]); // 1
NSLog(@"%i", [[NSString string] stringByAppendingString:@"foo"] ==
             [@"" stringByAppendingString:@"foo"]); // 1
NSLog(@"%i", @"" == [NSString string]); // 0
Но я не могу придумать ни одного случая использования, где разница имела бы значение.

@"" является литеральной строкой и будет существовать на протяжении всего выполнения приложения. [NSString string], вероятно, является динамически выделяемым объектом (но может быть оптимизирован, чтобы не быть), и поэтому может (теоретически) собираться во время выполнения, когда на него больше не ссылаются. Как литеральные строки, так и динамически выделяемые используют совместное использование внутри, поэтому два @"" или два [NSString string], скорее всего, вернут один и тот же объект - даже если не в одном файле - но нет никакой гарантии, что они вернутся. Однако они не могут возвращайте один и тот же объект.

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

Глядя на ассемблерный код, я бы предположил, что @"" имеет преимущество в производительности, но думать, что это важно, - это действительно случай преждевременной оптимизации.

Просто используйте @"", он имеет преимущество быть коротким и ясным.

Я совершенно уверен, что [NSString string] - это просто удобный метод для [[[NSString alloc] init] autorelease], который идентичен @"" в семантике.

Что означает, что нет никакого преимущества памяти вообще.

@"" используется для опустошения строки NS. строка используется для опустошения NSMutableString.

NSString * string = @"String";
NSMutableString * mutablestring;
[mutablestring setString:@"Mutable String"];

NSLog (@"%@", string);        // String
NSLog (@"%@", mutablestring); // Mutable String

string = @"";
mutablestring = [NSMutableString string];

NSLog (@"%@", string);        // empty, nothing actually prints in NSLog
NSLog (@"%@", mutablestring); // empty, nothing actually prints in NSLog

//The below statement gives warning.
mutablestring = @"";

@"" строковая константа,а значит-сохранить-релиз, и autorelease сообщения игнорируются. Также он не может быть освобожден.
[NSString string] уже автоматически выпущен.

Есть только одна вещь, которая имеет значение для меня: то, что я использую, - это действительно пустая строка. каждый раз, когда я вижу [NSString string], я на 100% гарантированно получаю строку с .length из 0.

Однако, когда я вижу @"", я не уверен на 100%, что он пуст. Теперь, 99,9999%, это безопасная ставка, но это так же легко может быть @"​" (пространство нулевой ширины), backspace, не столяр нулевой ширины и т. д. Надеюсь, что кодер-садист, который использовал это, оставил комментарий рядом с ним написано, что это пространство нулевой ширины, но просто чтобы мой код не был таким запутанным, я использую [NSString string].