Почему вы используете конструктор метода класса вместо alloc / init? - PullRequest
6 голосов
/ 19 февраля 2012

В Objective C / Cocoa есть два варианта для конструкторов:

1.Конструктор класса

Product *product = [Product productWithIdentifier:@"Chocolate"];
// Use product

2.Конструктор Alloc / init

Product *product = [[Product alloc] initWithIdentifier:@"Chocolate"];
// Use product
[product release];

Что я делаю

  • Я склонен использовать метод класса только потому, что он выглядит чищевыпуск не нужен.
  • Я вижу много ресурсов alloc / init - в чем преимущество такого способа?

Мой вопрос

  • Какой из них предпочтительнее?Или это просто вопрос вкуса?

Код

Для контекста класс Product будет иметь следующее значение:

+(Product *)productWithIdentifier:(NSString *)identifier_ {
   return [[[[self class] alloc] initWithIdentifier:identifier] autorelease];
}

-(Product *)initWithIndentifier:(NSString *)identifier_ {
   self = [super init]
   if (self) {
       identifier = identifier_;
   }
   return self;
}

Ответы [ 2 ]

5 голосов
/ 19 февраля 2012

Если вы используете ARC, между ними нет особой разницы.Если вы не используете ARC, разница чрезвычайно важна.

Комбинация alloc/init дает вам ссылку на владельца.Это означает, что вы должны release это позже.Вариант classnameWithFoo возвращает не владеющую ссылку.Вы не можете release it.

Это соответствует обычным соглашениям о присвоении имен Какао.Все методы возвращают не владеющие (автоматически выпускаемые) экземпляры, кроме методов, которые начинаются с alloc, copy, mutableCopy и new.Они возвращают владельцы ссылок, которые вы должны release.

Какой из них использовать, в основном, дело вкуса.Однако если вам нужны временные объекты, которые вы можете быстро утилизировать, вариант alloc приводит к несколько меньшему количеству вызовов методов (autorelease) и в цикле, это также уменьшает максимальный объем памяти.Однако в большинстве случаев эта сниженная стоимость пренебрежимо мала.

5 голосов
/ 19 февраля 2012

IMO, самое большое различие между этими двумя подходами связано с тем, что с помощью «конструктора классов» вы получаете объект с автоматическим освобождением; это наиболее удобный вариант, когда вы:

  1. назначить выделенный объект для retain свойств;

  2. когда вы создаете «временные» объекты (вспомните различные NSString методы, которые строят строку из другой строки: во многих случаях вам нужно «связывать» такие вызовы; конструктор позволяет вам « забудь "про управление памятью);

  3. когда вы добавляете объект к какому-либо объекту, который его сохраняет (подумайте: addSubview)

В таких случаях синтаксическое преимущество «конструктора класса» является главным, но я думаю, что оно также делает ваш код «более безопасным» с точки зрения управления памятью.

С другой стороны, когда вы создаете объект, чтобы назначить его свойству assign (или непосредственно ивару, для которого у вас нет свойства), тогда alloc/init будет отлично работать и будет предпочтительнее конструктора " "(ИМО).

Итак, в конце концов, это зависит от того, как вы собираетесь использовать объекты, которые вы выделяете. Конструктор класса - это удобный метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...