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]