10

有人可以解释如何控制 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;
}

提前致谢。

4

3 回答 3

19

因此,正如您所提到的,main()函数 inmain.m是起点,然后调用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启动主事件循环并调用-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/

于 2012-05-08T21:08:55.383 回答
8

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

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

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

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

于 2011-02-22T20:47:06.327 回答
2

来自 Apple 文档 -

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

应用程序生命周期

于 2011-02-22T20:45:24.643 回答