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