Нужно или стоит преобразовывать изменяемые объекты NSO в неизменяемые, прежде чем вернуться из методов?
Скажем, у вас есть метод, который возвращает NSDictionary. Для построения словаря вам может понадобиться создать NSMutableDictionary. Есть ли необходимость или преимущество в возвращении неизменной копии словаря, а не просто в изменяемом словаре?
например
- (NSDictionary *)doSomethingAndReturnADictionary {
NSMutableDictionary * dic = [NSMutableDictionary new];
// fill in dic
return dic;
}
или лучше сделать следующее:
- (NSDictionary *)doSomethingAndReturnADictionary {
NSMutableDictionary * dic = [NSMutableDictionary new];
// fill in dic
return [NSDictionary dictionaryWithDictionary:dic];
}
Я думаю, что копирование словаря, особенно если он большой, является пустой тратой ресурсов. Я предполагаю NSMutableDictionary
занимает больше памяти, но я сомневаюсь, что есть большая разница. Метод может вернуть NSMutableDictionary
, но если словарь не предназначен для изменения после возврата, зачем беспокоиться? Возвращенный словарь NSMutableDictionary
, но компилятор покажет это как NSDictionary
,
Тот же вопрос относится к NSArray
, NSString
и т. д. Мне не удалось найти аналогичный вопрос.
Любые лучшие практики / что-нибудь рассмотреть?
2 ответа
ИМО, это хорошая практика, чтобы вернуть неизменный объект, если ожидается неизменный.
Учти это:
NSString *stringExpectedToBeImmutable = [NSMutableString stringWithString:@"My immutable string."];
[((NSMutableString *) stringExpectedToBeImmutable) appendString:@" Really?"];
NSLog(@"%@", stringExpectedToBeImmutable);
Кто-то может ожидать, что NSString
Переданный в метод является неизменным и делает некоторые вычисления, основанные на этом предположении, затем в середине строки вычислений меняется. Когда вычисления начинались, длина строки составляла 20 символов, а вдруг - 28.
Это также причина, почему свойства типа, как NSString
должен быть объявлен как copy
,
Это, конечно, крайний случай, но проиллюстрировать проблему довольно хорошо.
Вместо [NSDictionary dictionaryWithDictionary:dic]
ты можешь позвонить [dic copy]
, Я думаю copy
Наиболее эффективный способ получить неизменяемую копию изменяемых объектов.
Заключить:
- если вы говорите, что возвращаете неизменный объект, возвращайте неизменный
- если какой-либо метод или API ожидают неизменный объект, присвойте им неизменный
- использование
copy
получить неизменяемую версию изменяемых объектов - Я бы не боялся накладных расходов. Преждевременная оптимизация это зло:)
Вы правы, как правило, это пустая трата ресурсов и не нужно. Изменяемый словарь по-прежнему является словарем, и любой, кто интересуется возвращаемым значением вашей функции, знает, что он должен восприниматься как простой словарь. Мы можем поблагодарить наследство за это.
Apple, похоже, следует тому же совету: возвращаемое значение [NSThread callStackSymbols]
является NSArray
, но если вы проверите его во время выполнения, вы обнаружите, что это экземпляр NSMutableArray