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

11

请问有人能够解释一下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;
}

提前致谢。


2
顺便提一下,UIApplicationMain() 永远不会返回。应用程序是通过调用 exit() 终止的。因此,在 main() 中放置在 UIApplicationMain(argc, argv, nil, nil); 之后的任何内容都将永远不会被执行。绝对不会。 - Dave DeLong
1
呃。@Dave如果那是真的,那真的让我感到恶心。这就像回到了BASIC时代,当我们只是在GOSUB的中间放置STOP一样! - Bradley Thomas
3个回答

19

所以,正如你所提到的,在main.m文件中的main()函数是起点,然后调用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/


8
正如您所说,UIApplicationMain在系统中创建了一个应用程序执行。 在应用程序加载过程中进行的所有工作中,我假设您对特定应用程序相关的内容感兴趣。 我还假设这是一个典型情况,这在Xcode提供的许多项目模板中有所说明。
应用程序加载过程查找应用程序信息属性列表。 在那里,它找到“主nib文件基本名称”,并且您的应用程序的UIApplication实例从应用程序包中加载相应的nib文件。 此nib文件指定应用程序委托类,并告诉将类的实例连接到UIApplication实例的委托属性。
根据主nib文件,也可能创建和连接其他对象,例如应用程序的窗口,主视图控制器等。
现在,加载序列结束,一切都是事件驱动的,从您的应用程序委托类开始获取著名的-applicationDidFinishLaunching:消息。

2

来自苹果文档 -

应用程序生命周期包括从启动到终止的事件序列。在iOS中,用户通过在主屏幕上点击其图标来启动应用程序。点击发生后不久,系统会显示一些过渡图形,并调用其主要功能来启动应用程序。从此时起,大部分初始化工作都交给了UIKit,它加载应用程序的主nib文件并准备好事件循环。

应用程序生命周期


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接