Одна книга для iPhone о программировании создает такие классы:
[[Class alloc] init]
Другая книга о Objective-C выглядит так:
[Class new]
Какая разница?
Одна книга для iPhone о программировании создает такие классы:
[[Class alloc] init]
Другая книга о Objective-C выглядит так:
[Class new]
Какая разница?
Первоначально в Objective-C объекты были созданы с новыми. По мере развития рамок OpenStep/Cocoa разработчики разработали мнение о том, что выделение памяти для объекта и инициализация его атрибутов были отдельными проблемами и, следовательно, должны быть отдельными методами (например, объект может быть выделен в определенной зоне памяти), Таким образом, стиль создания-инициализации объекта-объекта появился в пользу.
В принципе, новый старый и почти-но-не совсем устаревший - таким образом вы увидите, что классы Cocoa имеют множество методов init, но почти никогда не используют никаких новых новых методов.
+new
реализуется буквально как:
+ (id) new
{
return [[self alloc] init];
}
Ничего больше, не меньше. Классы могут переопределять его, но это очень нетипично в пользу выполнения чего-то вроде +fooWithBar:
.
Как уже упоминалось, по defaut нет разницы. Но вы можете перезаписать метод класса new
. Документация Apple имеет некоторые мысли по этому поводу.
В отличие от alloc, новое иногда повторное внедрение в подклассы для вызова инициализация класса метод [...] Часто новые... методы будут делать больше, чем просто распределение и инициализации.
Это зависит от класса, но [Class new]
, скорее всего, является методом удобства, который вызывает [[Class alloc] init]
внутренне. Таким образом, вы не можете вызывать другие методы init, такие как "initWithString".