Итак, как вы упомянули, функция 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/