Словарь NSDictionary vs init alloc vs new

Предположим, что я хочу, например, начать создавать пары ключ/значение, используя NSMutableDictionary. Кажется, у меня есть как минимум три варианта создания пустого, изменяемого словаря с неопределенной емкостью:

NSMutableDictionary *mutDict = [[NSMutableDictionary alloc] init]; // 1
NSMutableDictionary *mutDict = [NSMutableDictionary new];          // 2
NSMutableDictionary *mutDict = [NSMutableDictionary dictionary];   // 3

Теперь, насколько я понимаю, [NSObject new] практически (если не точно?) совпадает с [[NSObject alloc] init]. Поэтому мы можем в принципе объединить эти два варианта, насколько мне известно. Что касается метода [NSDictionary dictionary], но documentation говорит:

словарь

Создает и возвращает пустой словарь.

+ (id)dictionary

Возвращаемое значение

Новый пустой словарь.

Обсуждение

Этот метод объявляется в основном для использования с изменяемыми подклассами NSDictionary.

Если вам не нужен временный объект, вы также можете создать пустую с помощью alloc... и init.

У меня есть несколько вопросов относительно этой документации, чтобы начать с:

Во-первых, почему он даже объявлен в NSDictionary вместо NSMutableDictionary, если он предназначен для использования?

Во-вторых, что они подразумевают под "временным объектом" в этом контексте?

Вкратце: есть ли разница между третьей альтернативой выше, по сравнению с первыми двумя? Может ли что-то делать с автореализацией объектов? Это даже имеет значение в контексте автоматического подсчета ссылок (ARC)?

Обратите внимание, что этот вопрос относится и к другим классам, например [NSData data] и [NSArray array].

Я использую XCode 4.6.1 и iOS 6.1. Имеет ли значение то, что я использую в наши дни, используя ARC? Возможно, с некоторой точки зрения на производительность?

Спасибо за любую четкую информацию об этом!

Ответы

Ответ 1

Во-первых, почему он даже объявлен в NSDictionary вместо NSMutableDictionary, если он предназначен для использования?

Потому что он может быть полезен для получения пустого объекта NSDictionary. Ожидается, что он будет использоваться в основном с NSMutableDictionary, но это не значит, что он никогда не может использоваться с NSDictionary.

Во-вторых, что они подразумевают под "временным объектом" в этом контексте?

Похоже на плохую документацию. Вероятно, они хотели сказать, что если вы не хотите, чтобы он вводил пул авторесурсов, вы можете использовать alloc/init.


Если вы используете ARC, то какой из этих 3 методов вы выбираете, это полностью личное предпочтение, так как все они будут вести себя одинаково.

Если вы не используете ARC, вам следует использовать +dictionary в любое время, когда вам нужен автореклассированный словарь, и +alloc/init в любое время, когда вам нужен словарь, на который вы собираетесь удерживать (например, в ivar), или, альтернативно, если вы просто хотите избежать автореферата и -release вручную. +new почти никогда не используется в коде, отличном от ARC.

Ответ 2

1) Таким образом, вы можете использовать его в любом месте. Не очень полезно просто иметь словарь, но они вставляют его, чтобы вы могли, если вам когда-нибудь понадобится. Почему бы и нет?

2) Я предполагаю, что они означают объект, который не будет сохранен за пределами текущего объема. Это больше не имеет значения в дни ARC. Объект init'd всегда имел значение удержания 1, поэтому, если вы назначаете init (или новый), тогда объект должен быть освобожден. Было принято автоматическое определение результата метода factory, поэтому вам не нужно было беспокоиться о его выпуске в конце области действия. Если вы хотели использовать результат метода + словаря из области видимости, вам придется его сохранить.

Итак, в заключение, это не имеет значения. Используйте то, что делает вас счастливым.