Alloc, init и new в Objective-C

Одна книга для iPhone о программировании создает такие классы:

[[Class alloc] init]

Другая книга о Objective-C выглядит так:

[Class new]

Какая разница?

Ответ 1

Первоначально в Objective-C объекты были созданы с новыми. По мере развития рамок OpenStep/Cocoa разработчики разработали мнение о том, что выделение памяти для объекта и инициализация его атрибутов были отдельными проблемами и, следовательно, должны быть отдельными методами (например, объект может быть выделен в определенной зоне памяти), Таким образом, стиль создания-инициализации объекта-объекта появился в пользу.

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

Ответ 2

+new реализуется буквально как:

+ (id) new
{
    return [[self alloc] init];
}

Ничего больше, не меньше. Классы могут переопределять его, но это очень нетипично в пользу выполнения чего-то вроде +fooWithBar:.

Ответ 3

Как уже упоминалось, по defaut нет разницы. Но вы можете перезаписать метод класса new. Документация Apple имеет некоторые мысли по этому поводу.

В отличие от alloc, новое иногда повторное внедрение в подклассы для вызова инициализация класса метод [...] Часто новые... методы будут делать больше, чем просто распределение и инициализации.

Ответ 4

Это зависит от класса, но [Class new], скорее всего, является методом удобства, который вызывает [[Class alloc] init] внутренне. Таким образом, вы не можете вызывать другие методы init, такие как "initWithString".