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

时间:2011-02-22 20:29:13

标签: 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;
}

提前致谢。

3 个答案:

答案 0 :(得分:17)

因此,正如您所提到的,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启动main event loop并调用-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/

答案 1 :(得分:7)

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

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

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

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

答案 2 :(得分:2)

来自Apple文档 -

应用程序生命周期构成应用程序启动和终止之间发生的事件序列。在iOS中,用户通过点击主屏幕上的图标来启动您的应用程序。点击发生后不久,系统会显示一些过渡图形,并通过调用其主要功能继续启动应用程序。从现在开始,大部分初始化工作将移交给UIKit,UIKit将加载应用程序的主nib文件并准备事件循环。

Application Life Cycle