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



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



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


вместо:



SomeObject *myObject = [SomeObject new];


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

479   8  

8 ответов:

здесь есть куча причин: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 в Apple NSObject реализация. Маловероятно, что это когда-либо изменится, но в зависимости от вашего уровня паранойи, документация Apple для +new по-видимому, позволяет изменить реализацию (и нарушить эквивалентность) в будущем. По этой причине, поскольку "явное лучше, чем неявное" и для исторической преемственности, сообщество Objective-C обычно избегает +new. Однако вы можете, как правило, определить недавние Java-пользователи Цель-C их упорным использованием +new.

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.