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

Posted

技术标签:

【中文标题】Main中UIApplicationMain之后的Objective C执行顺序是啥?【英文标题】:What is Objective C execution order after UIApplicationMain in Main?Main中UIApplicationMain之后的Objective C执行顺序是什么? 【发布时间】:2011-02-22 20:29:12 【问题描述】:

有人能解释一下 ios 应用程序中的执行流程控制吗?我知道 UIApplicationMain 是首先从 main 调用的。然后呢?我定义的方法和 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;

提前致谢。

【问题讨论】:

仅供参考,UIApplicationMain() 永远不会回来。该应用程序通过调用exit() 终止。所以你在main() 中放在UIApplicationMain(argc, argv, nil, nil); 之后的任何内容都将永远 被执行。永远不会。 呃。 @Dave 如果那是真的,那真的让我很生气。就像回到 BASIC 时代,我们只是将 STOP 放在 GOSUB 的中间! 【参考方案1】:

所以,正如您所提到的,main.m 中的 main() 函数是起点,然后调用 UIApplicationMain()。如果您查看文档,您会看到 UIApplicationMain 有四个参数:

argc, *argv[], *principalClassName *委托类名。

其中前两个只是从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/

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

【参考方案3】:

来自 Apple 文档 -

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

Application Life Cycle

【讨论】:

以上是关于Main中UIApplicationMain之后的Objective C执行顺序是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C:UIApplicationMain第四个参数

应用程序App的启动过程

UIApplication,UIWindow,UIViewController,UIView(layer)简单介绍

“@UIApplicationMain”是啥意思?

Xcode 调试器不再显示违规行,而是始终显示 UIApplicationMain

应用程序过程控制器生命周期以及main函数之前的过程