iOS项目启动及启动时间优化
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项目启动及启动时间优化的更多相关文章
- iOS LaunchScreen启动图设置
新建的iOS 项目启动画面默认为LaunchScreen.xib 如果想实现一张图片作为启动页,如下图 如果启动不行 记得clear 一下工程 是启动页停留一段时间 只需要在 AppDelegat ...
- iOS 项目优化
前言 iOS性能优化系列篇之"优化总体原则" 不要提前过度优化 要找到性能瓶颈 要在不同性能指标间权衡 要理解优化任务的底层运行机制 要有技术保障体系 一.启动速度优化 1.1 学 ...
- iOS 启动时间优化
在 WWDC 2016 上首次提到了关于 App 应用启动速度优化的话题:Session 406 Optimizing App Startup Time. 一.冷启动与热启动 热启动是,APP会恢复之 ...
- 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. ...
- IOS 项目问题总结
把自己项目中遇到的问题总结一下,供大家参考,希望大家多多提出意见!! 在Xcode 6.2中遇到Your build settings specify a provisioning profile w ...
- 【Java】关于项目启动大请求量高负载时如何确保db等资源不出错的问题
如果一个项目启动时(单机), 瞬间来了1000个访问, 如何确保db等资源不会压垮呢? 现在想想我当时回答的并不好, 而现在看公司框架才发现其实有针对于这一块做过专门的优化的.下面就来分享下公司关 ...
- 马蜂窝 iOS App 启动治理:回归用户体验
增长.活跃.留存是移动 App 的常见核心指标,直接反映一款 App 甚至一个互联网公司运行的健康程度和发展动能.启动流程的体验决定了用户的第一印象,在一定程度上影响了用户活跃度和留存率.因此,确保启 ...
- 开源 iOS 项目分类索引大全 - 待整理
开源 iOS 项目分类索引大全 GitHub 上大概600个开源 iOS 项目的分类和介绍,对于你挑选和使用开源项目应该有帮助 系统基础库 Category/Util sstoolkit 一套Cate ...
- 现有iOS项目集成React Native过程记录
在<Mac系统下React Native环境搭建>配置了RN的开发环境,然后,本文记录在现有iOS项目集成React Native的过程,官方推荐使用Cocoapods,项目一开始也是使用 ...
随机推荐
- Web开发须知的浏览器内幕 缓存与存储篇(1)
本文禁止转载,由UC浏览器内部出品. 0.前言 大纲 浏览器缓存和存储相关的功能分为四类: 加载流程 Memory Cache Application Cache(简称AppCache) HTTP C ...
- 使用 npm 安装 Vue
使用 npm 安装 Vue 需要 node.js 就不多说了(从 nodejs.org 中下载 nodejs ) (1)安装 Vue,在 cmd 里直接输入: npm install -g cnpm ...
- 【Android Studio使用教程1】Android Studio导入项目的几种方法
本篇教程中使用到的Android Studio版本为1.0, Eclipse ADT版本23.0.4.请尝试更新到该版本. Android Studio默认使用 Gradle 构建项目, Eclips ...
- flask代码统计作业
用户表: create table userInfo( id int not null unique auto_increment, name )not null, password ) not nu ...
- iis7 未注册framework4 导致 莫名的404错误
server2008 R2 IIS7 已经安装 安装framework 4.6.1 然后建立站点 404错误 :在站点目录自动生成了 asp_client 重新注册到 iis(不需要) iisre ...
- 关于Unity3d的Quaternion.LookRotation的学习
首先,创建两个cube GameObject物件.Origin作为原点参考.Player是我们要实验的物件.如下图所示: 创建一个脚本Quat.cs,赋给Palyer cube.脚本如下: publi ...
- CSV输入输出
读取csv文件: import csv cf = open('D:\pywe.csv','rb') cf.readline() #读取标题行,光标移动到下一行(相当于调过标题行) for l in c ...
- Git小抄
生存必备 分支 忽略已提交的文件 版本回退 撤销修改 删除文件 修改最后一次提交的说明信息 tag 生存必备 git init git add <file1> <file2> ...
- 在oracle电子商务套件中输出信息
一.用自定义用户HAND_SL登陆http://zd01.haasgz.hand-china.com:30000/ 添加可执行并发程序 执行文件名填写自己的包名称.入口函数/过程名 二.将可执行程序添 ...
- 未能从程序集 C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Data.Entity.Build.Tasks.dll 加载任务“EntityClean”
问题: 未能从程序集 C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Data.Entity.Build.Tasks.dll 加载任务“Entity ...