1.App启动过程
1) 解析info.plist
2) 加载相关信息,例如闪屏
3) 沙盒建立,权限检查
4) Mach-O(什么是Mach-O)加载
5) 定位内部(rebase),外部指正引用(bind),例如字符串,函数等
6) 加载类的扩展中的方法
7) C++静态对象加载,调用Objec的 + load函数
mach-O
哪些名词指的是Mach-O?
1) Executable 可执行文件
2) Dylib 动态库
3) Bundle 无法被连接的动态库,只能通过dlopen()加载
4) Image 指的是Executable,Dylib或者Bundle的一种
5) Framework 动态库和对应的头文件和资源文件的集合
dyld的全称是dynamic loader,它的作用是加载一个进程所需要的image,dyld是开源的。
Main函数之前优化
启动的第一步是加载动态库,加载系统的动态库使很快的,因为可以缓存,而加载内嵌的动态库速度较慢。所以,提高这一步的效率的关键是:减少动态库的数量。
Rebase和Bind都是为了解决指针引用的问题。对于Objective C开发来说,主要的时间消耗在Class/Method的符号加载上,所以常见的优化方案是:
合并Category和功能类似的类。比如:UIView+Frame,UIView+AutoLayout…合并为一个
删除无用的方法和类。
多用Swift Structs,因为Swfit Structs是静态分发的
Initializers
通常,我们会在+load方法中进行method-swizzling,这也是Nshipster推荐的方式。
用initialize替代load。不少同学喜欢用method-swizzling来实现AOP去做日志统计等内容,强烈建议改为在initialize进行初始化。
如果使用swift,swift没有+load方法,initialize去替代
控制创建线程数量,非必要不创建线程
使用Swfit重写代码。
网友评论