iOS的APP的启动原理和布局(业务拆分和C弱化降低耦合)

APP的启动原理

  • 我们知道程序的入口是mian函数
int main(int argc, char * argv[]) {
 
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([CCAppDelegate class]));
    }
    
}

从上面的函数中我们可以看出有4个参数,我们主要来说说第三个和第四个参数

第三个参数:设置应用程序对象名称UIApplication或者它的子类,如果nil,测默认是UIApplication对象

第四个参数:应用程序的代理名称,这个地方可以更改自己定义的代理方法,要遵循 UIApplicationDelegate协议,实现协议方法
从上面的方法中 我们可以看到,我更改了其代理的名称CCAppDelegate

iOS的APP的启动原理和布局(业务拆分和C弱化降低耦合)

  • 启动原理

1.执行mian行数(程序的入口函数)

2.执行UIApplicationMain函数,创建UIApplication对象,设置UIApplication的代理

3.设置主运行循环(死循环),接受事件

4.加载info.plist文件,如果plist指定main(NSMainNibFile)或者xib文件,就去加载这个文件

5.程序启动完毕,通知代理(AppDelegate),应用程序启动完毕

iOS的APP的启动原理和布局(业务拆分和C弱化降低耦合)

AppDelegate的业务拆分

  • 如果AppDelegate需要执行或者配置文件很多的话,不方便我们管理和查找
  • 比如:启动广告页,激光推送,即时通讯类的配置,分享等,这时我们需要给AppDelegate 扩展出分类,方便我们管理

iOS的APP的启动原理和布局(业务拆分和C弱化降低耦合)

iOS的APP的启动原理和布局(业务拆分和C弱化降低耦合)

iOS的APP的启动原理和布局(业务拆分和C弱化降低耦合)

APP启动时间优化

APP启动事件可以分为2个T1 + T2
  • T1是指在执行main函数之前,主要是+(void)load;方法,这个方法是:文件加载内存的时候就被调用

iOS的APP的启动原理和布局(业务拆分和C弱化降低耦合)

从上面的图中我们可以看到,会加载main上面的的文件,及会执行里面的load,所以要尽量避免使用这个方法,如果必要可以用+(void)initialize代替

  • T2是指程序启动的时间优化,如果AppDelegate的配置文件过多,可以先让主线程加载主要的配置方法,其他的放到子线程中去
    • T2中还包含 pch预编译文件加大时长,其实这个在Xcode的时候,苹果是不建议使用的,静态ku,第三方的编译文件等