Использование alloc init вместо нового
Изучая Objective-C и примерный код чтения, я замечаю, что объекты обычно создаются с использованием этого метода:
SomeObject *myObject = [[SomeObject alloc] init];
вместо:
SomeObject *myObject = [SomeObject new];
Есть ли причина для этого, поскольку я прочитал, что они эквивалентны?
- Можно ли объявить dispatch_once_t предикат как переменную-член вместо статического?
- Можно ли отделить основную функцию и classы C ++ от подпрограмм Objective-C и / или C при компиляции и ссылке?
- Как я могу рассчитать разницу между двумя датами?
- Напишите UIImage вместе с метаданными (EXIF, GPS, TIFF) в библиотеке фотографий iPhone
- Кроссплатформенный обмен кодами iPhone / Android
- Есть ли простой способ разделить NSString на массив символов?
- Поиск через NSString с использованием регулярного выражения
- Свойство NSString: скопировать или сохранить?
- Что такое Objective C ++?
- iOS 7 sizeWithAttributes: замена для sizeWithFont: constrainedToSize
- biginteger по Objective-c
- Добавление объекта C ++ в Objective-C Class
- Получение NSDecimalNumber из определенной в локали строки?
Здесь есть несколько причин: 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]
.
Один короткий ответ:
- Оба они одинаковы. Но
- «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]
.