выделение, init, и новый в Objective C [дубликат]

49
задан neuromancer 25 July 2010 в 09:56
поделиться

4 ответа

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

По существу, new - это старое и почти-но не совсем устаревшее - поэтому вы увидите, что классы Cocoa имеют много методов init, но почти никогда не имеют пользовательских методов new.

71
ответ дан 7 November 2019 в 11:16
поделиться

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

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

13
ответ дан 7 November 2019 в 11:16
поделиться

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

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

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

75
ответ дан 7 November 2019 в 11:16
поделиться

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

3
ответ дан 7 November 2019 в 11:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: