Должен ли я вернуть NSMutableString в методе, который возвращает NSString - PullRequest
4 голосов
/ 29 мая 2010

Хорошо, у меня есть метод, который принимает NSString в качестве входных данных, выполняет операцию над содержимым этой строки и возвращает обработанную строку. Итак, декларация:

- (NSString *) processString: (NSString *) str;

Вопрос: я должен просто вернуть экземпляр NSMutableString, который я использовал в качестве своего «рабочего» буфера, или я должен создать новый NSString вокруг изменяемого и вернуть его?

Итак, я должен сделать это:

- (NSString *) processString: (NSString *) str
{
    NSMutableString *work = [NSMutableString stringWithString: str];
    // process 'work'
    return work;
}

Или это:

- (NSString *) processString: (NSString *) str
{
    NSMutableString *work = [NSMutableString stringWithString: str];
    // process 'work'
    return [NSString stringWithString: work]; // or [work stringValue]?
}

Второй делает еще одну копию возвращаемой строки, если только NSString не делает такие умные вещи, как копирование при модификации. Но первый возвращает то, что вызывающий мог, теоретически, пойти и изменить позже. Мне все равно, если они это сделают, так как строка принадлежит им. Но есть ли веские причины для предпочтения последней формы первой? И является ли stringWithString или stringValue предпочтительным по сравнению с другими?

1 Ответ

7 голосов
/ 29 мая 2010

Зависит полностью от того, насколько вам нужно защищаться.

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

Таким образом, если вы доверяете своим клиентам, вы также можете возвращать изменяемую строку (как NSString). Даже если клиент делает что-то глупое и мутирует, будь прокляты предупреждения компилятора, ничего не сломается.

Где это имеет значение имеет значение, когда вы возвращаете изменяемую резервную копию некоторого объекта, который не должен быть изменен извне. В этом случае клиент может игнорировать предупреждения компилятора и / или привести к изменяемому варианту и полностью заблокировать ваш объект.

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

Рекомендация. При вычислении и возвращении переходного значения изменчивость не имеет значения. При возврате ссылки на внутреннее изменяемое хранилище лучше всего сделать неизменную копию.

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