Нужно или стоит преобразовывать изменяемые объекты 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

Другие вопросы по тегам