iOS App冷启动优化:Before Main阶段

        

        iOS应用冷启动时,在 UIApplicationMain(argc, argv, nil, appDelegateClassName)方法执行前,主要经历以下阶段:     

        1. 执行exec()启动应用程序进程

        2. 加载可执行文件,即将应用程序的Mach-O文件加载到内存

        3. 加载Dyld:加载应用程序依赖的动态库

        4. Dyld加载其他动态库,分析动态库的依赖,并递归加载其他动态库

        5. Rebase:根据动态库加载的随机地址+符号偏移,为镜像中的符号生成真实的指针地址

        6. Bind:查询符号表,确定镜像中依赖的外部符号的内存地址

        7. Objc: 即注册OC类、协议, 以及将category中的方法添加到方法列表

        8.Initalizers:执行OC类的load方法,以及执行C++类的构造方法,C++初始化全局、静态对象。

        由此可知, 在应用程序启动时,

        1. 动态库加载越多,启动越慢。

        2. ObjC类方法越多,启动越慢。

        3. ObjC的+load方法越多,启动越慢。

        4. C的constructor函数越多,启动越慢。

        5. C++静态对象越多,启动越慢。

        优化策略:

        1. 减少动态库数量

        2. 删除无用的类或类中无用的方法,合并category,避免静态全局变量大量使用

        3. 尽量不重写类的load方法,以便尽可能使符号采用懒加载

        4. 避免在load方法中执行耗时操作,或者使用异步或多线程

        5. 减少使用xib进行页面布局,减少布局转换耗时

        6. 通过二进制重排,减少内存页加载

        method-swizzling改在initialize方法中虽然可以提升部分性能,但应十分谨慎。因为一旦category中实现了initialize方法,当前类的initialize会被覆盖,即可能不会执行,进而可以导致意料之外的严重问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/497795.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

仓储自动化新解:托盘四向穿梭车驶入智能工厂 智能仓储与产线紧密结合

目前,由于对仓库存储量的要求越来越高,拣选、输送以及出入库频率等要求也越来越高,对此,在物流仓储领域,自动化与智能化控制技术得以快速发展,货架穿梭车在自动库领域的应用越来越广泛。现阶段,…

Qt 简约美观的加载动画 小沙漏风格 第六季

这次和大家分享一个沙漏风格的加载动画 效果如下: 这是本系列的第六季了, 本次内容的关键在于cubicTo函数的使用, 在这里分享一个非常好用的网站https://www.desmos.com/calculator/cahqdxeshd 在这上面可以手动拖动贝塞尔曲线的控制点, 并且显示了起终点和两个控制点的精确坐…

前端JS 时间复杂度和空间复杂度

时间复杂度 BigO 算法的时间复杂度通常用大 O 符号表述,定义为 T(n) O(f(n)) 实际就是计算当一个一个问题量级(n)增加的时候,时间T增加的一个趋势 T(n):时间的复杂度,也就相当于所消耗的时长 O&#xff1…

动态规划(算法竞赛、蓝桥杯)--混合背包DP

1、B站视频链接&#xff1a;E14 背包DP 混合背包_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; const int N1010,M10000; int a[M],b[M],c[M];//体积、价值、类型 int f[N];int main(){int n,m,v,w,s;cin>>n>>m;int num1;for(int i1;i&…

【Java程序设计】【C00331】基于Springboot的驾校预约学习系统(有论文)

基于Springboot的驾校预约学习系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的驾校预约学习系统&#xff0c;本系统有管理员、用户和教练三种角色&#xff1b; 管理员&#xff1a;个人中心、管理员管理、教练…

linux gdb 调试工具

1.写程序 首先&#xff0c;我们先写出一个 .c 或者.cpp程序 如 然后 gcc -g hello.c -o hello 或者 g -g hello.cpp -o hello &#xff08;-g&#xff09;要加 2. gdb调试 用 gdb &#xff08;可执行程序&#xff0c;如hello&#xff09; 进入之后&#xff0c;有…

mongoDB 优化(1)索引

1、创建复合索引&#xff08;多字段&#xff09; db.collection_test1.createIndex({deletedVersion: 1,param: 1,qrYearMonth: 1},{name: "deletedVersion_1_param_1_qrYearMonth_1",background: true} ); 2、新增索引前&#xff1a; 执行查询&#xff1a; mb.r…

[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

mini-spring|关于Bean对象作用域以及FactoryBean的实现和使用

需求 FactoryBean 直接配置FactoryBean 获取FactoryBean中的Bean对象 FactoryBean的getObject方法通过反射获取Bean对象 由此省去对实体Dao类的定义 解决方法 对外提供一个可以二次从 FactoryBean 的 getObject 方法中获取对象的功能即可 整体架构 整个的实现过程包括了两部…

Python编程实验五:文件的读写操作

目录 一、实验目的与要求 二、实验内容 三、主要程序清单和程序运行结果 第1题 第2题 四、实验结果分析与体会 一、实验目的与要求 &#xff08;1&#xff09;通过本次实验&#xff0c;学生应掌握与文件打开、关闭相关的函数&#xff0c;以及与读写操作相关的常用方法的…

第五课:BIO高级操作

一、BIO模式下的端口转发思想 需求&#xff1a;需要实现是个客户端的消息可以发送给所有的客户端接收.(群聊实现) 我们每一个客户端都会和服务器端建立一个socket通道&#xff0c;这样服务器端和客户端就能够实现通信。为了让服务器端知道我们当前有多少个socket正在运行&…

国际黄金价格是什么?和黄金价格有何区别?

黄金是世界上最珍贵的贵金属之一&#xff0c;其价值被无数人所垂涎。而国际黄金价格作为市场上的参考指标&#xff0c;直接影响着黄金交易的买卖。那么国际黄金价格到底是什么&#xff0c;与黄金价格又有何区别呢&#xff1f;本文将为您详细解答。 国际黄金价格是指以美元计量的…