2015-10-23 4 views
7

Существуют, по-видимому, разные методы создания экземпляров NSArrays (то же самое для NSDictionary и некоторых других).Разница между NSArray.array/.new/@ []/alloc-init

Я знаю:

  1. [NSArray array]
  2. [NSArray new]
  3. @[]
  4. [[NSArray alloc] init]

Для удобства понимания я обычно придерживаться [NSArray array], но в чем разница между всеми, все они действительно делать то же самое?

+0

Сравнить http://stackoverflow.com/questions/5423211/difference-between-nsmutablearray-array-vs-nsmutablearray-alloc-init, http://stackoverflow.com/questions/14527489/using-array-of- items-vs-nsarray-arraywithobjects и http://stackoverflow.com/questions/719877/use-of-alloc-init-instead-of-new. –

+0

И как именно вопрос связан с [быстрым]? –

ответ

11

Результат одинаковый для всех из них, вы получаете новый пустой неизменяемый массив. Однако разные методы имеют разные последствия для управления памятью. Используя ARC, это не имеет никакого значения в конце, но перед ARC вам нужно будет использовать правильную версию или отправлять соответствующие сообщения о сохранении, выпуске или автозапуске.

[NSArray new] и [[NSArray alloc] init] вернуть массив с сохранением +1. Перед ARC вам придется выпустить или автоопределить этот массив или утечку памяти.

[NSArray array] и @[] вернуть уже автореализованный массив (сохранить количество 0). Если вы хотите, чтобы он придерживался без ARC, вам придется вручную сохранить его или он будет освобожден, когда будет запущен текущий пул авторезистов.

7
  1. [NSArray array]: Создает и возвращает пустой массив

  2. [NSArray new]: alloc, init и возвращает объект NSArray

  3. @[]: То же, что 1.

  4. [[NSArray alloc] init]: То же, 2.

Different между [NSArray array] и [[NSArray alloc] init], если есть не-ARC:

  • [NSArray array] является объектом autorelease. Вы должны позвонить retain, если хотите сохранить его. Например, когда вы используете return.

  • [[NSArray alloc] init] является предметом хранения. Таким образом, вам больше не нужно звонить retain, если хотите сохранить его.

С ARC они такие же.

+0

было бы более разумным, если бы вы могли объяснить, когда мы должны знать разницу между '[NSArray array];' и '[[NSArray alloc] init];' например и почему. – holex

+0

@holex. Спасибо. Я улучшил свой ответ. – anhtu

Смежные вопросы