Ответ на ваш следующий вопрос:
После # 1 foo был объявлен , но неинициализирован .
После # 2 foo был выделен , но все еще неинициализирован .
После # 3, foo инициализирован .
На практике вы никогда не хотите разделять шаги 2 и 3, то есть ваш код должен быть foo = [[NSString alloc] init]
. Причина этого в том, что «опасно» выделять объект, а не инициализировать его или неправильно инициализировать.
Если вы просто сделаете это foo = [NSString alloc]
, но забудете когда-либо вызывать init, использовать foo небезопасно, поскольку он не был инициализирован. Точно так же небезопасно делать это [foo init]
(обратите внимание на отсутствие переназначения для foo), потому что init может возвращать ссылку на инициализированный объект, отличную от той, которая была первоначально выделена alloc.