NSDictionary + dictionaryWithDictionary или -copy?

Что считается лучшим способом получить новый словарь из оригинального:

[NSDictionary dictionaryWithDictionary:otherDictionary];

или

[otherDictionary copy];

?

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

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

Ответ 1

Собственно, они разные, но не по той причине, что вы ожидаете. Я предполагаю, что вы используете ARC (а если нет, то почему бы и нет?), Поэтому автоотпуск возвращаемого объекта не имеет значения.

Вот как они отличаются: рассмотрите, что произойдет, если otherDictionary - nil.

Хорошо, если вы используете:

[otherDictionary copy]; // or -mutableCopy

Вы вернетесь nil, потому что у вас есть приемник nil.

С другой стороны, если вы используете:

[NS(Mutable)Dictionary dictionaryWithDictionary:otherDictionary];

Вы вернете NS(Mutable)Dictionary, независимо от того, является ли otherDictionary nil или нет.

Это хорошо в ситуации, когда вам нужно создать копию словаря и затем захотеть экземпляр NSDictionary, но вы не хотите тестировать nil (yay для уменьшения циклической сложности!).

Ответ 2

В этом вопросе есть пара вопросов:

Во-первых, эти два немного отличаются:

[NSDictionary dictionaryWithDictionary:otherDictionary];    #1
[otherDictionary copy];                                     #2

# 1 возвращает объект с автореализацией (т.е. один с подсчетом сохранения +0); # 2 возвращает объект с сохранением +1, поэтому вызывающий абонент отвечает за вызов release в какой-то момент.

(Они также немного отличаются, если otherDictionary есть nil: # 1 возвращает пустой словарь, а # 2 возвращает nil.)

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

[NSMutableDictionary dictionaryWithDictionary:otherDictionary];
[otherDictionary mutableCopy];

Для каждого из этих методов применяются те же оговорки, что и выше.

Вероятно, не лучший способ сам по себе, но mutableCopy является самым ясным (просто помните, что в какой-то момент вам нужно освободить сохраненный объект).

Ответ 3

Они семантически эквивалентны. Какой из них использовать, это вопрос выбора. Я пользуюсь -copy, просто потому, что он короче и делает то, что происходит более ясно.

Если вам нужна измененная копия (как указывает ваш текст), строки, которые вы опубликовали, не будут работать. Вам нужно:

[NSMutableDictionary dictionaryWithDictionary:otherDictionary];

или, что эквивалентно:

[otherDictionary mutableCopy];

Что касается управления памятью, -copy и -mutableCopy, верните объект с сохранением +1, что означает, что вам нужно освободить их, когда вы закончите с ними. -dictionaryWithDictionary: возвращает объект с автореализацией, поэтому вам не нужно его выпускать, когда вы закончите с ним, и его нужно сохранить, если вы хотите его сохранить. В старые (pre-ARC) дни это различие означало, что используемый вами подход может зависеть от ваших потребностей в управлении памятью (они все равно взаимозаменяемы после дополнительного сохранения или выпуска, конечно). Конечно, если вы используете ARC, это различие не имеет для вас значения.

Ответ 4

Cocoa -адаптированный способ - отправить метод mutableCopy, который возвращает измененную копию:

NSMutableDictionary *mutableOtherDictionaryCopy = [otherDictionary mutableCopy]