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属性读取

大概图示如下:

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项目启动及启动时间优化的更多相关文章

  1. iOS LaunchScreen启动图设置

    新建的iOS 项目启动画面默认为LaunchScreen.xib 如果想实现一张图片作为启动页,如下图 如果启动不行  记得clear 一下工程 是启动页停留一段时间  只需要在 AppDelegat ...

  2. iOS 项目优化

    前言 iOS性能优化系列篇之"优化总体原则" 不要提前过度优化 要找到性能瓶颈 要在不同性能指标间权衡 要理解优化任务的底层运行机制 要有技术保障体系 一.启动速度优化 1.1 学 ...

  3. iOS 启动时间优化

    在 WWDC 2016 上首次提到了关于 App 应用启动速度优化的话题:Session 406 Optimizing App Startup Time. 一.冷启动与热启动 热启动是,APP会恢复之 ...

  4. ios项目里扒出来的json文件

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Menlo; color: #000000 } p.p2 { margin: 0.0px 0. ...

  5. IOS 项目问题总结

    把自己项目中遇到的问题总结一下,供大家参考,希望大家多多提出意见!! 在Xcode 6.2中遇到Your build settings specify a provisioning profile w ...

  6. 【Java】关于项目启动大请求量高负载时如何确保db等资源不出错的问题

      如果一个项目启动时(单机), 瞬间来了1000个访问, 如何确保db等资源不会压垮呢? 现在想想我当时回答的并不好, 而现在看公司框架才发现其实有针对于这一块做过专门的优化的.下面就来分享下公司关 ...

  7. 马蜂窝 iOS App 启动治理:回归用户体验

    增长.活跃.留存是移动 App 的常见核心指标,直接反映一款 App 甚至一个互联网公司运行的健康程度和发展动能.启动流程的体验决定了用户的第一印象,在一定程度上影响了用户活跃度和留存率.因此,确保启 ...

  8. 开源 iOS 项目分类索引大全 - 待整理

    开源 iOS 项目分类索引大全 GitHub 上大概600个开源 iOS 项目的分类和介绍,对于你挑选和使用开源项目应该有帮助 系统基础库 Category/Util sstoolkit 一套Cate ...

  9. 现有iOS项目集成React Native过程记录

    在<Mac系统下React Native环境搭建>配置了RN的开发环境,然后,本文记录在现有iOS项目集成React Native的过程,官方推荐使用Cocoapods,项目一开始也是使用 ...

随机推荐

  1. 04.CSS选择器-->相邻、通用兄弟选择器

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. <Android 应用 之路> MPAndroidChart~PieChart

    简介 MPAndroidChart是PhilJay大神给Android开发者带来的福利.MPAndroidChart是一个功能强大并且使用灵活的图表开源库,支持Android和IOS两种,这里我们暂时 ...

  3. post字符 特殊字符处理【转】

    今天和同事调试接口,由于产品设计的问题,传递的参数没有做任何的限制.同事就在传参数的时候加了些特殊字符到后台,但是后台打印的日志是 null... 然后上网搜了下解决办法:转 https://www. ...

  4. 从零学React Native之04自定义对话框

    本篇主要介绍: 1. 自定义组件 2. Alert 对话框 自定义对话框 之前的我都是利用React Native提供的基础组件对它们进行排列组合, 其实自定义也很简单, 我们还是拿上一篇文章的例子进 ...

  5. 一个java内存泄漏的排查案例

    这是个比较典型的java内存使用问题,定位过程也比较直接,但对新人还是有点参考价值的,所以就纪录了一下. 下面介绍一下在不了解系统代码的情况下,如何一步步分析和定位到具体代码的排查过程 (以便新人参考 ...

  6. delete in javascript

    Key word delete. 1. Delete global object. x = 42; // creates the property x on the global object var ...

  7. Linux入门-8 Linux系统启动详解

    系统启动流程 BIOS MBR GRUB KERNEL INIT 单用户修改root密码 GRUB加密 系统启动流程 BIOS MBR: Boot Code 执行引导程序 - GRUB 加载内核 执行 ...

  8. 小米OJ 有多少个等差数列

    题目链接 https://code.mi.com/problem/list/view?id=20 代码 #include <bits/stdc++.h> using namespace s ...

  9. webbench 网站压力测试

    [root@localhost ~]# webbench -c 500 -t 4 http://172.24.61.41/Webbench - Simple Web Benchmark 1.5Copy ...

  10. 为OS X增加环境变量

    1.创建并以 TextEdit 的方式打开 ~/.bash_profile 文件 touch ~/.bash_profile; open -t ~/.bash_profile 2.新增环境变量 exp ...