@ "" против [строка NSString] - PullRequest
       9

@ "" против [строка NSString]

6 голосов
/ 11 января 2012

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

Ответы [ 6 ]

5 голосов
/ 11 января 2012

Вполне вероятно, что @"" == [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

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

2 голосов
/ 11 января 2012

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

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

Просмотр кода ассемблера I 'Я предполагаю, что @"" имеет преимущество в производительности, но думать, что это важно, на самом деле является случаем преждевременной оптимизации.

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

1 голос
/ 14 января 2016

@ "" используется для очистки строки NSString.строка используется для очистки 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 = @"";
1 голос
/ 11 января 2012

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

Это означает, что нет никакой пользы от памяти вообще.

0 голосов
/ 18 сентября 2015

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

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

0 голосов
/ 11 января 2012

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

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