Установщик NSString с использованием isEqualToString - PullRequest
1 голос
/ 12 ноября 2009

В книге Pragmatic Core Data я наткнулся на этот фрагмент кода для установки NSString:

- (void)setMyString:(NSString*)string; 
{
    @synchronized(self) { 
        if ([string isEqualToString:myString]) return; 
        [myString release]; 
        myString = [string retain]; 
    } 
} 

Есть ли причина использовать [string isEqualToString:myString] вместо string == myString здесь? Не означает ли это, что если две строки имеют одинаковое содержимое, результат будет отличаться от того, если они на самом деле являются одним и тем же объектом? Имеет ли это значение?

Спасибо.

1 Ответ

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

Обратите внимание, что сравниваемые переменные являются указателями на строки NSStrings. Сравнение указателей просто проверяет, ссылаются ли указатели на один и тот же адрес. Он ничего не знает о контенте в конце. Два строковых объекта в двух разных местах могут иметь одинаковое содержимое. Таким образом вам нужно isEqualToString:. В этом случае я тоже не уверен, что это очень важное различие. Для меня было бы больше смысла, если бы это был специальный корпус, отправляющий уведомления об изменениях, основанные на том, будет ли новая строка действительно изменением.

Кстати, в установщике NSString вы почти всегда хотите copy, а не retain. Я не знаю точного варианта использования в этой книге, но если вы просто сохраните строку и она окажется изменчивой, она может измениться за вашей спиной и привести к странным результатам. И если строка не изменяемая, copy это просто псевдоним для retain.

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