iOS app main方法之后做的操作

在iOS开发中,我们都知道,程序的入口是main()函数,位于main.m中。通常情况下,main()函数中的代码是不需要修改的。那么,main()函数中做了哪些操作呢?

main函数的实现

在Xcode中新建一个工程之后,Xcode会自动的帮我们生成main.m以及main()函数,main()函数通常是这样的:

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

main()函数中调用了UIApplicationMain()方法,在确认UIApplicationMain()方法做了什么之前,先来了解一些基本的概念。

UIApplication

在开发中,偶尔会用到UIApplication对象,比如[UIApplication sharedApplication],从使用上来看,就可以猜到这是一个单例对象。实际上,UIApplication对象代表的就是一个app,一个app在运行期间只能有一个UIApplication对象。如果在程序中新建UIApplication对象,会报错。看一下UIApplication类中的一些属性和方法:

@interface UIApplication : UIResponder
+ (UIApplication *)sharedApplication;
@property(nullable, nonatomic, assign) id<UIApplicationDelegate> delegate;
@end
UIApplicationDelegate

UIApplicationDelegate是一个协议,定义在UIApplication.h中,可以看一下UIApplicationDelegate中方法,非常的熟悉:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(nullable NSDictionary *)launchOptions NS_AVAILABLE_IOS(3_0);
- (void)applicationDidBecomeActive:(UIApplication *)application;
- (void)applicationWillResignActive:(UIApplication *)application;
...

这些方法正是AppDelegate.h中提供的方法。移动开发中,app是非常容易受到打扰的,比如说来电、通知,app随时有可能进入后台,甚至被杀死。UIApplicationDelegate协议中的方法正是用来处理这些事件的,app进入前台,进入后台,app被杀死等。

刚才也提到了,Xcode自动生成的AppDelegate文件中实现了UIApplicationDelegate协议中的方法,那么很自然的猜测,AppDelegate类遵守了UIApplicationDelegate协议,事实正是这样:

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@end
UIApplicationMain

UIApplicationMain()接收了4个参数,首先看一下UIApplicationMain()方法的定义:

int UIApplicationMain(int argc, char * _Nonnull * _Null_unspecified argv, NSString * _Nullable principalClassName, NSString * _Nullable delegateClassName);

argc、argv是系统参数,和其他语言类似。principalClassName是应用程序名称,默认传nil即可,传nil代表的是使用UIApplication类,delegateClassName是代理类名,该类必须要遵守UIApplicationDelegate协议。

现在根据main()函数,来分析下UIApplicationMain()做的事情:
1. 根据传入的principalClassName,创建一个UIApplication对象
2. 根据传入的delegateClassName,创建一个遵守UIApplicationDelegate协议的对象,默认情况下是AppDelegate对象
3. UIApplication对象中有一个属性是 delegate,第2布生成的类赋值给UIApplication对象的delegate属性。
4. 之后开启一个runloop,也就是主runloop,处理事件。

到这里,UIApplication对象已经建立,并且能够处理事件。然而,我们的app最终是要显示到屏幕上,展示给用户看的,一个app如何显示到屏幕上呢?

app的显示

app能够显示到屏幕上,不得不提到一个特殊的view,UIWindow,正是由于UIWindow的存在,app才能展示在用户面前。

UIWindow

UIWindow是一个特殊的UIView, app启动之后,创建的第一个视图控件就是UIWindow。需要注意的是,UIWindow本身并不做显示,UIWindow更像是一个容器,添加到UIWindow上的view会被显示到屏幕上。

根控制器的创建

我们知道,一个UIWindow必须要有rootViewController,app启动之后会创建一个UIWindow,那么该UIWindow的rootViewController是如何创建的呢?

实际上,app启动后,会加载info.plist文件,如果在info.plist文件中指定了main.storyboard,那么就去加载main.storyboard,根据main.storyboard初始化控制器,并将该控制器赋值给UIWindow的rootViewController属性。如果没有指定main.storyboard,需要手动创建UIViewController,并赋值给UIWindow的rootViewController。手动创建的操作通常是在

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
 {  
    return YES;  
} 

方法中。

UIWindow会自动将其rootViewController的view添加,这样其rootViewController就可以显示到屏幕上。

总结

到这里,我们了解到了main()作为程序的入口,做了哪些操作,以及一个app是如何显示到屏幕上的。这篇文章和之前的两篇文章结合起来看,就是一个app启动的完整流程。

完。

发布了71 篇原创文章 · 获赞 34 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/TuGeLe/article/details/81610319