Какова цель наличия как NSMutableString, так и NSString? - PullRequest
5 голосов
/ 17 ноября 2009

Почему Objective C предоставляет и класс NSString, и подкласс NSMutableString, а не просто NSMutableString? Разве NSString не эквивалентен «const NSMutableString»?

В C ++ у вас есть только один строковый класс, std :: string, и если вам нужна константа, вы объявляете const std: string.

Мне интересно знать, почему я не должен просто использовать NSMutableString везде и никогда не беспокоиться о NSString? Должна быть причина, иначе разработчики языка не предоставят и того, и другого. может это займет меньше памяти или что-то?

Ответы [ 4 ]

6 голосов
/ 17 ноября 2009

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

На самом деле работает

NSString *A = @"Bob";
NSString *B = @"Bob";

в отладчике сразу показывает, что оба они являются указателями на одну и ту же строку. На самом деле

NSString *C = [NSString stringWithString:@"Bob"];
NSString *D = [A copy];

оба указывают на один и тот же адрес памяти. Тем временем

NSString *E = [NSMutableString stringWithString:@"Bob"];

указывает на другую строку.

Так что да, использование NSStrings в некоторых случаях более эффективно. И вообще какао позволяет возвращать новую копию строки, а не отредактированную. Тем не менее, я не могу утверждать, что вы не должны использовать изменяемую строку везде, но она, кажется, идет вразрез с общими рекомендациями для платформы.

В моей собственной работе я склонен использовать только изменчивые варианты, когда мне нужно редактировать вещи напрямую. Это всего лишь немного отсталая от стиля C / C ++: все изменяемое, если вам не нужен const, все является const, если вам не нужна изменчивость.

5 голосов
/ 17 ноября 2009

Причиной для обоих классов является та же причина, по которой вы иногда используете std :: string, а иногда - const std :: string. Однако, в отличие от C ++, Objective-C не имеет методов const, поэтому они вместо этого отделяют const-методы от не-const-методов в два разных класса. Это также наблюдается во многих основных классах, таких как NSArray (NSMutableArray), NSDictionary (NSMutableDictionary) и т. Д.

0 голосов
/ 17 ноября 2009

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

0 голосов
/ 17 ноября 2009

Я бы сказал, что общее правило гласит: «Не используйте класс, целью которого является предоставление функциональности, которая вам не нужна». Если вам нужно изменить содержимое строки напрямую, используйте NSMutableString. Если нет, используйте NSString. С точки зрения размера и того, сколько места они занимают, сами классы должны быть примерно одинаковыми.

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