Использование alloc init вместо нового

Изучая Objective-C и примерный код чтения, я замечаю, что объекты обычно создаются с использованием этого метода:

SomeObject *myObject = [[SomeObject alloc] init]; 

вместо:

 SomeObject *myObject = [SomeObject new]; 

Есть ли причина для этого, поскольку я прочитал, что они эквивалентны?

Здесь есть несколько причин: http://macresearch.org/difference-between-alloc-init-and-new

Некоторые из них:

  • new не поддерживает пользовательские инициализаторы (например, initWithString )
  • alloc-init более явный, чем new

Общее мнение кажется, что вы должны использовать то, с чем вам удобно.

Очень старый вопрос, но я написал несколько примеров просто для удовольствия – может быть, вы найдете это полезным;)

 #import "InitAllocNewTest.h" @implementation InitAllocNewTest +(id)alloc{ NSLog(@"Allocating..."); return [super alloc]; } -(id)init{ NSLog(@"Initializing..."); return [super init]; } @end 

В основной функции оба утверждения:

 [[InitAllocNewTest alloc] init]; 

а также

 [InitAllocNewTest new]; 

приводят к тому же выводу:

 2013-03-06 16:45:44.125 XMLTest[18370:207] Allocating... 2013-03-06 16:45:44.128 XMLTest[18370:207] Initializing... 

+new эквивалентно +alloc/-init в реализации +alloc/-init Apple. Маловероятно, что это когда-либо изменится, но в зависимости от вашего уровня паранойи, документация Apple для +new похоже, позволит изменить реализацию (и нарушить эквивалентность) в будущем. По этой причине, поскольку «явный лучше, чем неявный» и для непрерывности истории, сообщество Objective-C обычно избегает +new . Тем не менее, вы можете заметить недавних поклонников Java для Objective-C своим упорным использованием +new .

Часто вам нужно передать аргументы init и поэтому вы будете использовать другой метод, например [[SomeObject alloc] initWithString: @"Foo"] . Если вы привыкли писать это, вы привыкли делать это таким образом, и поэтому [[SomeObject alloc] init] может [SomeObject new] более естественно, что [SomeObject new] .

Один короткий ответ:

  1. Оба они одинаковы. Но
  2. «new» работает только с базовым инициализатором init и не будет работать с другими инициализаторами (например, initWithString :).

Для заметки я лично использую [Foo new] если я хочу, чтобы что-то в init выполнялось без использования его возвращаемого значения в любом месте. Если вы не используете возврат [[Foo alloc] init] любом месте, вы получите предупреждение. Более или менее я использую [Foo new] для глазных конфет.

Я очень опаздываю на это, но хочу упомянуть, что новое на самом деле небезопасно в Obj-C со стремительным миром. Swift будет создавать только метод init по умолчанию, если вы не создадите другой инициализатор. Вызов нового classа Quick с пользовательским инициализатором приведет к сбою. Если вы используете alloc / init, тогда компилятор будет правильно жаловаться, что init не существует.

Если новый выполняет эту работу для вас, это сделает ваш код еще скромнее. Если бы вы в противном случае называли [[SomeClass alloc] init] во многих разных местах вашего кода, вы создадите Hot Spot в новой реализации, то есть в среде выполнения objc, что уменьшит количество промахов в кэше.

В моем понимании, если вам нужно использовать пользовательский инициализатор, используйте [[SomeClass alloc] initCustom] .

Если вы этого не сделаете, используйте [SomeClass new] .

  • Как сравнить две даты в Objective-C
  • Как предотвратить циклическую ссылку, когда Swift-заголовок заголовка импортирует файл, который импортирует сам Hopscotch-Swift.h
  • Класс эквивалентен методу -ответчик для выбора:
  • NSLocale currentLocale всегда возвращает «en_US», а не текущий язык пользователя
  • Вызов метода экземпляра из метода classа
  • Как я могу получить UIBarButtonItem с изображением и текстом?
  • Как можно разрабатывать приложения для iPhone на Java?
  • @class против #import
  • Objective C - получение номера строки или полной трассировки стека из-за ошибки отладчика?
  • Лучший способ определить частные методы для classа в Objective-C
  • Извлечение текста pdf в Objective C
  • Interesting Posts

    Как я могу проверить целостность чтения / записи компактного флеш-устройства?

    Когда реализуются блокировки Fn, FnMut и FnOnce?

    Абстракция VS Информация, скрывающая VS Encapsulation

    Я ничего не могу записать на дисках NTFS в kubuntu 16.10

    Есть ли способ разделить окно / вкладку одного браузера на 2 области просмотра?

    Сравнение BSXFUN и REPMAT

    Сообщение jQuery ajax для веб-службы

    Является ли этот ключ-ориентированный шаблон защиты доступа известной идиомой?

    Как использовать class Timer для вызова метода, сделать что-то, сбросить таймер, повторить?

    Автоматическое подключение к Интернету по умолчанию при запуске Windows

    Пример для boost shared_mutex (многократное чтение / запись)?

    Как заставить Windows 7 переключаться между программами быстрее через какое-то время?

    Как установить язык плиток начального экрана в Windows 8

    Почему диалоговое окно брандмауэра Mac OS X периодически появляется и исчезает само по себе (без ответа) под Snow Leopard?

    почему список шрифтов пуст для imagemagick?

    Давайте будем гением компьютера.