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,项目一开始也是使用 ...
随机推荐
- JS 变量 命名规范 oDiv aDiv 等
l命名规范及必要性 l可读性--能看懂 l规范性--符合规则 l匈牙利命名法 l类型前缀 类型 前缀 类型 实例 数组 a Array aItems 布尔值 b Boolean bIsComplete ...
- vmware 虚拟机导入OVF出现路径错误
现状: 需要将原有数据中心的VM虚拟机导出本地OVF模板,然后迁移至新的机房虚拟化环境后从新导入. 问题: 导入OVF时候,先出现错误问题1,修复完成后,出现错误问题2 1. OVF迁移至本地以后,导 ...
- Ubuntu 搭建Web服务器(MySQL+PHP+Apache)详细教程
Ubuntu 搭建Web服务器(MySQL+PHP+Apache)详细教程 看了好多人的博客,有的不全 or 有问题,整理了一下,适合小白 新手先整理几个小问题 1.为啥使用 Linux 搭建服务器? ...
- Windows10禁用update
1.运行 gpedit.msc 或搜索 组策略 ,点 计算机配置—管理模板—Windows组件—Windows更新—配置自动更新 ,设置“已禁用”.2.点 控制面板—系统和安全—管理工具 ,点 服务 ...
- 将eChart图片利用POI导出到Excel
在使用POI进行将数据导出到Excel时, 若要将eChart在前端生成的统计图(如柱状图.折线图.饼图等)一并导出,使用POI在后台构建数据图比较复杂,因此我选择将eChart在前端的统计图的bas ...
- 万能的JDBC工具类。通过反射机制直接简单处理数据库操作
package com.YY.util; import java.io.IOException; import java.io.InputStream; import java.sql.Connect ...
- [翻译] KVNProgress
KVNProgress KVNProgress is a fully customizable progress HUD that can be full screen or not. KVNProg ...
- webpack笔记三 管理输出
webpack笔记三 管理输出 增加src/print.js: export default function printMe() { console.log('I get called from p ...
- 编写VBA宏生成页面
概述 依据详细设计中表设计,借用excel宏编写VBA生成页面. 特色 高定制.高效率.兼容所有生成要求.不依赖低耦合.任意Sheet适用 缺陷 不支持批量Sheet页生成 VBA源码 Sub lis ...
- 沉淀再出发:mongodb的使用
沉淀再出发:mongodb的使用 一.前言 这是一篇很早就想写却一直到了现在才写的文章.作为NoSQL(not only sql)中出色的一种数据库,MongoDB的作用是非常大的,这种文档型数据库, ...