Нужно ли мне вызывать [super init] или [super initWithCoder] и т. Д. Для NSObject? - PullRequest
12 голосов
/ 02 апреля 2012

Обычно, когда я делаю подкласс из класса UI, я вызываю интересующий инициализатор суперкласса.Тем не менее, я не уверен в деталях реализации NSObject, и похоже, что с точки зрения членов-членов ничего особенного не происходит, поэтому я задаюсь вопросом: нужно ли мне вызывать [super init], если мой подкласс расширяется NSObject

Ответы [ 3 ]

10 голосов
/ 02 апреля 2012

Технически, нет.В документации для -[NSObject init] говорится, что

Метод init, определенный в классе NSObject, не инициализируется;он просто возвращает self.

Поскольку он задокументирован и, вероятно, уже существует куча кода, который полагается на него, этот факт весьма вряд ли изменится в будущих версияхMac OS X.

Редактировать: BoltClock's Unicorn поднимает вопрос, который я хотел бы сделать более гиперболическим: общее время, сэкономленное, не вызывая -[NSObject init]для всех, кто когда-либо запускал вашу программу, вряд ли когда-либо превысит время отладки, которое вы понесете, если вы когда-нибудь измените суперкласс для вашего класса на что-то отличное от NSObject и забудете добавить вызов к [super init].

5 голосов
/ 02 апреля 2012

Из документации кажется, что она вообще не инициализируется:

Метод init, определенный в классе NSObject, не инициализируется; он просто возвращает self.

Полагаю, было бы небезопасно не звонить [super init], но нет никаких причин не следовать соглашениям и, в любом случае, вызывать его в своем подклассе. Например, ваш подкласс может в конечном итоге наследовать от другого класса, который может содержать логику инициализации в своем собственном методе -init, который затем потребуется вашему подклассу.

0 голосов
/ 02 апреля 2012

Просто вызовите один из назначенных super инициализаторов в вашей реализации, потому что вы должны просто делать то, что ясно и правильно.

...