Что такое порядок выполнения Objective C после UIApplicationMain в Main? - PullRequest
8 голосов
/ 22 февраля 2011

Может кто-нибудь объяснить, как управление выполнением протекает в приложении для iOS?Я знаю, что UIApplicationMain вызывается первым из main.Тогда что?Какая связь между моими определенными методами и основными?Это все обусловлено событиями или может быть какая-то структурированная последовательность?

Я не хочу быть таким расплывчатым, мне просто нужно знать, с чего начать.Возможно, я смотрю на это неправильно.

Например, в C ++ я бы сделал что-то вроде:

#include "myMethods.h"
int main (int argc, char * const argv[]) {

   Method1(); // Initialization
   Method2(); // Opening views and options
   Method3(); // Meat of the program

   return 0;
}

Заранее спасибо.

Ответы [ 3 ]

17 голосов
/ 09 мая 2012

Итак, как вы упомянули, функция main() в main.m является отправной точкой, которая затем вызывает UIApplicationMain(). Если вы проверите документы, вы увидите, что UIApplicationMain принимает четыре аргумента:

  • argc,
  • * argv [],
  • * principalClassName
  • * delegateClassName.

Первые два из них - это просто количество аргументов и список переменных, переданных из main(). Но третий и четвертый аргументы являются указателями на строки NSStrings. Третий аргумент указывает, какой класс должен быть UIApplication. Если вы не намерены использовать подкласс UIApplication, вы указываете nil в качестве третьего аргумента. Четвертый аргумент указывает, какой класс должен быть классом делегата UIApplication, который будет реагировать на все, что указано в протоколе UIApplicationDelegate. Вам не нужно напрямую этим заниматься, так как это включено во все шаблоны Xcode:

int main(int argc, char *argv[])
{
    @autoreleasepool {
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

Не позволяйте биту NSStringFromClass([AppDelegate class])) отбросить вас. Это просто причудливый способ указать четвертый аргумент, чтобы вызывался правильный делегат, если позже вы измените имя AppDelegate.m.

UIApplication запускает цикл основного события и вызывает -application:didFinishLaunchingWithOptions:, один из методов, который должен обрабатывать его делегат. Посмотрите на AppDelegate.m, и вы найдете код шаблона для этого метода. Здесь вы можете начать настройку, создавая вещи, которые должны быть на месте до создания UIWindow и другие экземпляры UIView:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;
}

Итак, теперь окно приложения и контроллер корневого представления определены, и приложение выключено и работает.

Все это, и немного больше, здесь прекрасно объяснено: http://oleb.net/blog/2012/02/app-launch-sequence-ios-revisited/

7 голосов
/ 22 февраля 2011

Как вы сказали, UIApplicationMain создает выполнение приложения в системе. Из всего, что делает процесс загрузки приложения, я предполагаю, что вы заинтересованы в том, что относится к конкретному приложению. Также я предполагаю типичный случай, который иллюстрируется во многих шаблонах проектов, которые предоставляет XCode.

Процесс загрузки приложения просматривает список информационных свойств приложения. Там он находит «Основное имя файла пера», и экземпляр UIApplication вашего приложения загружает соответствующий файл пера из комплекта приложения. Этот nib-файл определяет класс делегата приложения и указывает подключить экземпляр класса к свойству делегата вашего экземпляра UIApplication.

В зависимости от основного файла пера могут быть созданы и подключены и другие объекты, например, окно приложения, контроллер основного вида и т. Д.

Теперь последовательность загрузки заканчивается, и все зависит от события, начиная с вашего класса делегата приложения, чтобы получить известное сообщение -applicationDidFinishLaunching:.

2 голосов
/ 22 февраля 2011

Из документов Apple -

Жизненный цикл приложения представляет собой последовательность событий, которые происходят между запуском и завершением вашего приложения. В iOS пользователь запускает ваше приложение, нажимая его значок на главном экране. Вскоре после нажатия система отображает переходную графику и запускает приложение, вызывая его основную функцию. С этого момента основная часть работы по инициализации передается UIKit, который загружает основной файл пера приложения и готовит цикл обработки событий.

Жизненный цикл приложения

...