App 总启动时间
) = t1(main 调用以前的加载时间
) + t2(main 调用以后的加载时间
)系统 dylib(动态连接库)
和自身 App 可执行文件的加载
main
方法执行以后到AppDelegate
类中的application:didFinishLaunchingWithOptions:
方法执行结束前这段时间,主要是构建第一个界面,并完成渲染展现t1
阶段加快App
启动的建议:dylib
动态库合并成一个optional linking
,若是App
用到的系统库在你全部支持的系统版本上都有,就设置为required
,由于optional
会有些额外的检查Objective-C Class、Selector、Category
的数量,能够合并或者删减一些OC
类+load
中作的事情尽可能挪到+initialize
中,+initialize
是在第一次初始化这个类以前被调用,+load
在加载类的时候就被调用。尽可能将+load
里的代码延后调用C++
虚函数,建立虚函数表有开销__attribute__((constructor))
将方法显式标记为初始化器,而是让初始化方法调用时才执行。好比使用dispatch_once(),pthread_once()或 std::once()
dlopen(),dlopen()
有性能和死锁的可能性t2
阶段加快App
启动的建议:xib/storyboard
,而是用纯代码做为首页UI
,若是要用xib/storyboard
,不要在xib/storyboard
中存放太多的视图application:didFinishLaunchingWithOptions:
里的任务尽可能延迟加载或懒加载NSUserDefaults
中存放太多的数据,NSUserDefaults
是一个plist
文件,plist
文件会被反序列化一次log
,少用NSLog
,由于每一次NSLog
的调用都会建立一个新的NSCalendar
实例GCD
建立过多的线程,解决方法是建立串行队列,或者使用带有最大并发数限制的NSOperationQueue
磁盘、网络、Lock或者dispatch_sync、发送消息给其余线程
等操做———————————————————————————————————————面试
2020 联盟持续更新,精品小圈子每日都有新内容,干货浓度极高。markdown
结实人脉、讨论技术 你想要的这里都有!网络
抢先入群,跑赢同龄人!(入群无需任何费用)数据结构
BAT大厂面试题、独家面试工具包,架构
资料免费领取,包括 数据结构、底层进阶、图形视觉、音视频、架构设计、逆向安防、RxSwift、flutter,并发