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

标签 objective-c sequence execution uiapplication control-flow

有人可以解释一下 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,您会找到此方法的一些模板代码。这是您可以开始自定义的地方,创建在 UIWindowUIView 的其他实例创建之前需要到位的东西:

- (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/

相关文章:

objective-c - IOS UICollectionview动态改变单元格的高度

dictionary - 我的程序的map/zipmap部分会消耗太多内存吗?

list - F#中的列表序列?

php - 防止多次执行 JavaScript 函数

ios - 在 ios 7 中关闭 UIAlertView 不起作用?

ios - 保留文件夹结构 Cocoa Pods

java - 有没有办法在 Macbook Pro 上的 Eclipse 中暂停正在运行的 Java 程序的执行?

java - 在java中运行cmd-line失败

ios - Objective-C - 何时使用 NSNumber 与 Primitive

ruby-on-rails - 如何在 FactoryBot 中生成混合字母字符和数字的序列值?