Это не исключение, потому что это узкий контракт.
Если вы попытаетесь pop_back
пустой вектор, поведение не определено, и реализация в режиме отладки вполне может выбрать исключение.
Деструкторы, вызываемые стандартной библиотекой, не должны выбрасывать, опасаясь неопределенного поведения.
Существует набор причин здесь: http://macresearch.org/difference-between-alloc-init-and-new
Некоторые выбранные:
new
не поддерживает пользовательские инициализаторы (как initWithString
)alloc-init
является более явным, чем new
Общее мнение, кажется, что необходимо использовать то, чем Вы довольны.
+new
эквивалентно +alloc/-init
в Apple NSObject
реализация. Очень маловероятно, что это будет когда-либо изменяться, но в зависимости от Вашего уровня паранойи, документации Apple для +new
кажется, допускает изменение реализации (и повреждение эквивалентности) в будущем. Поэтому, потому что "явный лучше, чем неявный" и для исторической непрерывности, сообщество Objective C обычно избегает +new
. Можно, однако, обычно разыскивать недавних посетителей Java к Objective C их упорным использованием +new
.
Часто, Вы испытываете необходимость для передачи аргументов init
и таким образом, Вы будете использовать другой метод, такой как [[SomeObject alloc] initWithString: @"Foo"]
. Если Вы привыкли писать это, Вы привыкаете делать его этот путь и так [[SomeObject alloc] init]
может прибыть более естественно это [SomeObject new]
.