Хорошо, у меня есть метод, который принимает 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
предпочтительным по сравнению с другими?