В приложениях для айфонов функция main используется минимально. В действительности большинство работы выполняет UIApplicationMain. Функция main выполняет всего три вещи: создает autorelease пул, вызывает UIApplicationMain и освобождает autorelease пул. Код функции main приведен ниже:
- #import <UIKit/UIKit.h>
- int main(int argc, char *argv[])
- {
- int retVal = UIApplicationMain(argc, argv, nil, nil);
- [pool release];
- return retVal;
- }
Делегат приложения ответственен за управление несколькими критическими системными сообщениями и должен присутствовать в каждом приложении для айфона. Объект может быть экземпляром любого класса, но должен быть совместим с протоколом UIApplicationDelegate. Методы этого протокола определяют перехватчиков событий в жизненном цикле приложения и предоставляют возможность реализовывать произвольное поведение.
Главный nib-file загружается в процессе инициализации приложения. Если информационный список свойств приложения (Info.plist) содержит ключ NSMainNibFile, то объект UIApplication загружает nib-файл, определенный этим ключом. Это единственный nib-файл, который загружается автоматически.
Nib-файл – файл ресурсов, расположенный на диске и хранящий в себе копию одного или нескольких объектов. Главный nib-файл приложения обычно состоит из объекта окна, делегата приложения и возможно одного или нескольких ключевых объектов для управления окном. Загрузка такого файла означает воспроизведение сохраненных в нем объектов в виде реальных объектов памяти, которые приложение сможет использовать. Объекты из этих файлов ничем не отличаются от объектов, созданных программным путем. Однако для пользовательских интерфейсов рекомендуется использовать именно nib-файлы, которые создаются при использовании Interface Builder для проектирования интерфейса, нежели создавать интерфейс приложения программно.
После запуска приложения система создает процесс и главный поток, в котором осуществляется запуск главного исполняющего цикла и настройка обработки событий. После этого цикл постоянно сканирует наличие источников данных для обработки. Когда поступает новое событие, цикл пробуждает исполняющий поток и передает управление обработчику, соответствующему данному событию. После окончания обработки управление возвращается циклу, который начинает обработку следующего события или, в случае его отсутствия, переводит поток в сон. Разработчик может сам переопределить обработку поступающих событий через класс NSRunLop. Поиск обработчика события идет по цепи обработчиков, которая обычно начинается с первичного обработчика. Если он не может обработать событие, то он передает его следующему обработчику в цепи. Сообщение продвигается вверх по цепочке до самого верхнего обработчика, такого как окно, приложение и делегат приложения – пока сообщение не будет обработано. Если обработчик не найден, то событие отбрасывается.
Источник