Начать с метода init или нет? - PullRequest
5 голосов
/ 18 июля 2011

Мне было интересно, когда мы используем метод "init" в проекте? Я видел много проектов без него, они использовали «applicationDidFinishLaunching» для запуска приложения, но не метод init, у вас есть какие-либо идеи по этому поводу?

Большое спасибо

Ответы [ 2 ]

3 голосов
/ 18 июля 2011

Метод init используется для инициализации объекта после его выделения. Если он не определен, то вызывается реализация базового класса, как и с любым другим методом в Objective-C, и если базовый класс не имеет метода init, то базовый класс «базовый класс» init будет и т. д. до NSObject init, что точно предусмотрено.

Если вы не объявите метод init, вы не сможете правильно инициализировать ивары в своем классе, если таковые имеются.

О applicationDidFinishLaunching, это метод для особого класса, который есть у любого приложения Cocoa / iOS, его делегата. Например:

 @interface myAppDelegate : NSObject <UIApplicationDelegate> {
 ...
 }

(N.B .: UIApplicationDelegate может быть также NSApplicationDelegate)

Как вы видите, этот класс является производным от NSObject, поэтому он будет инициирован платформой путем вызова метода init, определенного в этом классе (который конкретно зависит от каркаса). Затем, в какой-то момент, платформа вызовет метод applicationDidFinishLaunching, и у вас есть возможность инициализировать всех участников ваших делегатов и сделать все, что вам нужно для запуска приложения.

В этом случае тот факт, что вы не обязаны выполнять инициализацию в методе init, а в applicationDidFinishLaunching, связан с определенной схемой взаимодействия между вашим объектом UIApplication (или NSApplication) и его делегатом. Этот шаблон был определен Apple таким образом;

  1. вы указываете свой класс делегата приложения либо в вашем MainWindow.xib, либо при вызове UIApplicationMain в main.c;

  2. фреймворк отвечает за создание экземпляра этого класса (в соответствии с пользовательским способом, с которым программистам не нужно иметь дело) и вызывает applicationDidFinishLaunching, чтобы вы могли делать с ним все, что вам нужно.

Надеюсь, это объяснение поможет вам понять, что происходит с делегатом приложения и почему вы не объявляете метод init.

1 голос
/ 18 июля 2011

Реализация init метод не требуется, если вы не хотите выполнить некоторую пользовательскую инициализацию.

Док говорит,

Подклассы должны переопределить метод init, чтобы добавить специфический для класса код инициализации. Версии init для подкласса должны включать код инициализации для классов, от которых они наследуются, посредством сообщения на super:

...