У меня завидная ситуация, когда я работал на парня, который написал +alloc
в 1991 году, и я случайно задал ему очень похожий вопрос несколько месяцев назад. Добавление +alloc
было для обеспечения +allocWithZone:
, что было для добавления пулов памяти в NeXTSTEP 2.0, где память была очень ограничена (4M). Это позволило вызывающей стороне контролировать, где объекты были размещены в памяти. Это была замена для +new
и его родственников, которые были (и остаются, хотя никто не использует их) однофазным конструктором, основанным на new
Smalltalk. Когда Cocoa перешла в Apple, использование +alloc
уже было укоренилось, и возврата к +new
уже не было, хотя на самом деле выбор NSZone
редко имеет существенную ценность.
Так что это не большой 1-фазный / 2-фазный философский вопрос. На практике какао имеет однофазную конструкцию, потому что вы всегда делаете (и всегда должны) вызывать их в одном вызове без проверки на +alloc
. Вы можете думать об этом как о сложном способе ввода «нового».