项目启动:
看下app的启动入口Main函数:
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]))
}
}
先看UIApplicationMain方法的定义:
UIApplicationMain(int argc, char * _Nonnull * _Null_unspecified argv, NSString * _Nullable principalClassName, NSString * _Nullable delegateClassName)
UIApplicationMain 方法里面的参数是什么意思,又做了哪些操作呢?
1.argc:系统或者用户传入的参数
2.argv:系统或用户传入的实际参数
3.principalClassName:默认为nil,则表示为UIApplication,传入nil和传入UIApplication效果一样;这里传入的参数必须 是为UIApplication的子类。
4.delegateClassName:指定应用程序的代理类,该类必须遵守UIApplicationDelegate协议。
传入这些参数后UIApplicationMain主要做了四件事:
1.创建了一个application对象;
2.设置application的代理;
3.建立了一个事件循环(RunLoop);
4.读取info.plist 文件,NSMainNibFile属性读取
大概图示如下:
![](https://img.haomeiwen.com/i9929392/39bcf744531a42fe.png)
UIApplicationMain方法执行加载完毕后,AppDelegate会执行代理方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
如果没有使用storyboard进行开发,则需要在此方法里面创建UIWindow窗口,UIWindow继承于UIView,是应用程序中的第一个视图控件,设置完Farme及相关根控制器,一个空的项目即启动成功;
启动时间的优化:
在实际项目中可能添加很多第三方如导航,分享,第三方登录等功能,会在Appdelegate的启动代理方法里面做很多初始化,大量的方法文件在启动时加载初始化,会影响app的启动时间,影响用户体验,这里怎么去优化呢?
我们先把启动时间分为两个部分:T1(执行main函数前)+T2(main函数后),{T1:系统环境布局时间:创建进程,加载解析可执行文件(库加载,堆栈环境配置等等),T2:从main到第一个界面显示的时间}
1.库加载越多,启动越慢;
2.Objc类越多,启动越慢;
3.静态对象全局对象越多,启动越慢;
4.Objc的 +load越多,启动越慢;
前面T1(1,2,3)我们可以在开发过程中,尽量去减少不需要的库文件,及相关无效的变量进行优化;
T2部分的优化我们更能把控,1. +load方法尽量避免使用,如果非要使用里面的逻辑操作一定要少,因为+load方法是在main函数以前就会去调用加载;2.在启动过程中,可以把一些耗时的操作或者一些第三方的初始化配置移到子线程执行。
以上是个人对iOS项目启动和启动时间的一些理解,不足之处可以留言交流一下。
网友评论