Main中UIApplicationMain之后的Objective C执行顺序是什么?

Old*_*her 8 objective-c sequence execution uiapplication control-flow

有人可以解释如何控制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;
}
Run Code Online (Sandbox Code Playgroud)

提前致谢.

jam*_*jim 17

因此,正如您所提到的,main()函数in 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]));
    }
}
Run Code Online (Sandbox Code Playgroud)

不要让NSStringFromClass([AppDelegate class]))有点扔你.这只是指定第四个参数的一种奇特方式,以便在您稍后更改名称时调用正确的委托AppDelegate.m.

UIApplication启动主事件循环并调用-application:didFinishLaunchingWithOptions:其委托必须处理的方法之一.看一下AppDelegate.m,你会发现这个方法的一些模板代码.您可以在此处开始自定义,创建在创建get的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;
}
Run Code Online (Sandbox Code Playgroud)

因此,现在定义了应用程序窗口和根视图控制器,并且应用程序已关闭并正在运行.

所有这一切,以及更多,都在这里得到了极好的解释:http://oleb.net/blog/2012/02/app-launch-sequence-ios-revisited/


MHC*_*MHC 7

正如您所说,UIApplicationMain在系统中创建应用程序执行.在应用程序加载过程中所做的事情中,我假设您对与特定应用程序相关的内容感兴趣.此外,我假设一个典型的案例,在Xcode提供的许多项目模板中都有说明.

应用程序加载过程会查看应用程序的信息属性列表.在那里找到"主nib文件基本名称",应用程序的UIApplication实例从应用程序包中加载相应的nib文件.此nib文件指定应用程序委托类,并告诉将类的实例连接到UIApplication实例的delegate属性.

根据主nib文件,也可以创建和连接其他对象,例如,应用程序的窗口,主视图控制器等.

现在加载序列结束,一切都是事件驱动的,从应用程序委托类开始,以获取着名的-applicationDidFinishLaunching:消息.