有人可以解释一下 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;
}
提前致谢。
最佳答案
因此,正如您提到的,main.m
中的 main()
函数是起点,然后调用 UIApplicationMain()
.如果你查看文档,你会看到 UIApplicationMain
接受四个参数:
- argc,
- *参数[],
- *校长类(class)名
- *委托(delegate)类名。
其中前两个只是从 main()
传递的参数计数和变量列表。但是第三个和第四个参数是指向 NSStrings 的指针。第三个参数指定哪个类应该是 UIApplication
.除非您打算对 UIApplication
进行子类化,否则您可以为第三个参数指定 nil
。第四个参数指定哪个类应该是 UIApplication 的委托(delegate)类,它将响应 UIApplicationDelegate
中指定的任何内容。协议(protocol)。您不必直接处理它,因为它包含在所有 Xcode 模板中:
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
不要让 NSStringFromClass([AppDelegate class]))
把你搞砸了。这只是指定第四个参数的一种奇特方式,以便在您稍后更改 AppDelegate.m
的名称时调用正确的委托(delegate)。
UIApplication
启动 main event loop并调用 -application:didFinishLaunchingWithOptions:
,这是其委托(delegate)必须处理的方法之一。查看 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;
}
因此,现在应用程序窗口和 Root View Controller 已定义,应用程序已关闭并运行。
所有这些,以及更多,在这里得到了很好的解释:http://oleb.net/blog/2012/02/app-launch-sequence-ios-revisited/
关于objective-c - Main 中 UIApplicationMain 之后的 Objective C 执行顺序是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5083576/