Использование alloc init вместо нового
изучая Objective-C и читая пример кода, я замечаю, что объекты обычно создаются с помощью этого метода:
SomeObject *myObject = [[SomeObject alloc] init];
вместо:
SomeObject *myObject = [SomeObject new];
есть причина для этого, как я читал, что они эквивалентны?
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в AppleNSObjectреализация. Маловероятно, что это когда-либо изменится, но в зависимости от вашего уровня паранойи, документация Apple для+newпо-видимому, позволяет изменить реализацию (и нарушить эквивалентность) в будущем. По этой причине, поскольку "явное лучше, чем неявное" и для исторической преемственности, сообщество Objective-C обычно избегает+new. Однако вы можете, как правило, определить недавние Java-пользователи Цель-C их упорным использованием+new.
часто вам нужно будет передавать аргументы в
initи так вы будете использовать другой метод, например[[SomeObject alloc] initWithString: @"Foo"]. Если вы привыкли писать это, вы получаете в привычку делать это таким образом и так[[SomeObject alloc] init]может прийти более естественно, что[SomeObject new].
один короткий ответ:
- одинаковы. Но
- ' 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