В Какао, какова цель класса main.m? - PullRequest
4 голосов
/ 10 февраля 2010

Он просто сидит там ... Как запустить код независимо от действий пользовательского интерфейса (например, не только в ответ на нажатие кнопки)? Я пытаюсь инициализировать некоторые объекты и запустить некоторые сценарии ДО того, как я пробудился отromNib. Как мне это сделать?

Ответы [ 2 ]

20 голосов
/ 10 февраля 2010

В Какао, какова цель класса main.m?

Нет, потому что его нет.

Во-первых, файл .m не является классом. Ни то, ни другое Практика помещения @interface класса в файл .h (заголовок) и его @implementation в файл .m (реализация) является соглашением, не более того. Это хорошее соглашение, но оно не поддерживается языком.

Итак, файл .m содержит ноль или более реализаций классов. Обычно это ровно один. Иногда это два, где другой - маленький закрытый класс, чей @interface также находится в том же файле.

main.m не содержит классов. Обычно он содержит только одну функцию с именем main.

main происходит от C (из которых Objective-C является надмножеством) и является точкой входа в программу: именно там начинается запуск программы. Все происходит здесь или в функции, вызываемой здесь. Инструмент командной строки обычно также завершает работу, возвращая main.

Большинство main функций в приложениях Какао являются функциями по умолчанию, которые поставляются с шаблоном проекта; эта реализация просто выполняет хвостовые вызовы NSApplicationMain, которые настраивают общий объект NSApplication и запускают его. Эта функция никогда не возвращается; когда пользователь выходит из приложения Какао, процесс просто завершается.

Вы можете прочитать этот список важных фактов о Какао и Objective-C , которые я написал. Похоже, у вас есть некоторые заблуждения (вероятно, перенесенные из другой структуры, с которой вы более знакомы), и этот список может быть вам понятен.

Как запустить код независимо от действий пользовательского интерфейса (например, не только в ответ на нажатие кнопки)?

Это зависит от того, когда вы пытаетесь это сделать. Например, периодическим действием будет задание для таймера .

Я пытаюсь инициализировать некоторые объекты и запустить некоторые сценарии ДО ТОГО, как я пробудуFromNib. Как мне это сделать?

Вы можете сделать это в initWithCoder:, который отправляется каждому объекту, не относящемуся к уровню отображения, который создается из архива, включая ваш. Перья тоже архивы.

Вы также можете рассмотреть возможность использования в качестве делегата приложения и реализации a applicationWillFinishLaunching: метода .

Третий способ - вставить код в main. Обратите внимание, что практически любой код Какао здесь может регистрировать предупреждения «без пула автоматического выпуска », если вы не включите его в оператор @autoreleasepool; другие решения не имеют этой проблемы, потому что NSApplication уже создал пул автоматического выпуска.

3 голосов
/ 10 февраля 2010

main.m - это то, что запускает приложение - для запуска вещей перед загрузкой nibs поместите его в main.m до создания NSApplication.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...