Основная проблема с кодом в вашем примере заключается в том, что в некоторых случаях метод -init возвращает объект, отличный от того, который вы создали с помощью + alloc.Если это произойдет, то ваш код будет неправильным, потому что вы не присваиваете результат [c init]
для c, и в итоге вы работаете с неправильным объектом (и тем, который не был должным образом инициализирован).Вот почему стандартная идиома состоит в том, чтобы всегда объединять + alloc и -init в одной строке:
id c = [[Person alloc] init];
Теперь вы, возможно, написалиКласс Person и из первых рук знают, что -init всегда возвращает один и тот же объект, но мне не нужно быть близко знакомым с внутренними принципами Person, чтобы прочесть ваш код и понять, является ли он правильным или нет.Ваш код «лучше» в том смысле, что любой может сказать, что он поступает правильно, если вы следуете обычному соглашению.
Я не думаю, что ужасно объявлять c в качестве идентификатора типа, но кажетсяглупо в этом случае.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *Если есть веская причина для использования идентификатора, это нормально, но если вы можете более точно определить тип, вам следует это сделать.