美文网首页面试题iOS面试资料搜集
iOS大厂面试题:iOS 如何优化 App 的启动耗时

iOS大厂面试题:iOS 如何优化 App 的启动耗时

作者: 一意孤行的程序猿 | 来源:发表于2020-04-02 15:21 被阅读0次

    OS 的 App 启动时长大概可以这样计算:

    • t(App 总启动时间) = t1(main 调用之前的加载时间) + t2(main 调用之后的加载时间)

    • t1 = 系统 dylib(动态链接库)自身 App 可执行文件的加载

    • t2 =main方法执行之后到AppDelegate类中的application:didFinishLaunchingWithOptions:方法执行结束前这段时间,主要是构建第一个界面,并完成渲染展示

    1.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()有性能和死锁的可能性

    • 在初始化方法中不创建线程

    2.在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 持续更新,精品小圈子每日都有新内容,干货浓度极高。

    • 结实人脉、讨论技术 你想要的这里都有!

    • 抢先入群,跑赢同龄人!(入群无需任何费用)

    • (直接搜索群号:789143298,快速入群)
    • 点击此处,与iOS开发大牛一起交流学习

    申请即送:

    • BAT大厂面试题、独家面试工具包,

    • 资料免费领取,包括 数据结构、底层进阶、图形视觉、音视频、架构设计、逆向安防、RxSwift、flutter,


    原文作者:72行代码

    相关文章

      网友评论

        本文标题:iOS大厂面试题:iOS 如何优化 App 的启动耗时

        本文链接:https://www.haomeiwen.com/subject/kzyxphtx.html