美文网首页
iOS Main 函数之前探究

iOS Main 函数之前探究

作者: NieFeng1024 | 来源:发表于2018-05-20 17:06 被阅读31次
App 运行流程
    build 流程
        1. 预编译 Preprocessing
            1. .c —> .i
            2. 删除#define 宏展开
            3. 处理条件预编译指令
            4. 处理预编译指令
            5. 删除注释
            6. 添加行号
            7. 保留#pragma 编译器指令
        2. 编译 Complication
            1. 扫描
            2. 语法分析
            3. 词法分析
            4. 语义分析
            5. 优化后生成的汇编代码
            6. .i —>.s
        3. 汇编 Assembly
            1. .s—> .o生成目标文件 
            2. 汇编器根据机器指令表将汇编代码生成机器指令
        4. 链接 Linking 0-—符号
            1. 地址和空间分配
            2. 符号决议(符号绑定)
            3. 重定位
            4. 链接生成.out 可执行文件
        5. 程序源代码被编译后主要分成两种段
            1. 程序指令(代码段)
            2. 程序数据 (数据段  .bbs)
    1. 程序为什么被分为数据段和指令段?
        1. 数据区对于进程readwrite
        2. 指令区对于进程readonly
        3. 防止程序指令被有意无意的改写
        4. CPU缓存被分为数据缓存指令缓存 分区有利于CPU效率
        5. 当系统中运行多个程序的副本时,指令是一样的,所以内存中只需要一份就可以

main 函数启动之前app 启动流程
1. main函数之前 
    1. main函数之前
        1. 操作系统会调用当前app进程
        2. 进程初始化
    2. 初始化需要的线程
        1. main-thread
        2. kernthread - 子线程
        3. gputools thread-子线程
    3. _dyld_start
        1. dyld main 
        2. initializemain
        3. imageLoader runinitializers—>proress intializers—>recursive initlization
        4.  imageLoaderMach-O 
            1. doinit
            2. domodinitfunc
        5. dyld_notify
        6. load_image
        7. call_load_method
            1. import 之后重写+load 方法的类会执行load方法
        8. libsystem
        9. libsystem_initializer
        10. libsystem_init
        11. _os_object_init
        12. _objc_init
        13. 执行main 函数
2. 分为以下几个阶段
    1. Commond B —> Build 生成可执行文件Mach-O (mac || iOS 系统可执行文件)
        1. 预编译
        2. 编译
        3. 汇编
        4. 链接
    2. Commond R —> Run
    3. dyld start
    4. 动态链接 ImageLoader 加载可执行文件, 里边是被编译过的符号,代码等  
    5. runtime与+load
    6. main 函数入口

动态链接系统的库应该是动态库,不然N个应用不会加载N个UIKit

欢迎指正!
    1. 操作系统是应用程序和硬件之间的中间人,硬件中最主要的是CPU,处理应用事件。
    1. 有操作系统知道 CPU 正在处理哪个进程,下一个该处理哪个进程,哪个进程在等待,什么时候杀掉哪个进程
    1. CPU 执行的最小单元是线程Thread,有操作系统来调度线程,让CPU执行
    1. 每一个Thread 都有一个线程栈,有一个Runloop 监听事件保证程序被执行CPU别闲着,有一个autoreleasepool 内存管理

新建一个工程, 一行代码没有写,系统内存分布,可以看到链接了多少个库

进程.png GCD.png VM.png UIRemotekeyboard.png GoogleProtobuf.png

dyld
原文链接

《程序员的自我修养》 - 密码: rppr

《操作系统设计原理与精髓第六版》 - 密码: u2x5

相关文章

  • iOS Main 函数之前探究

    操作系统是应用程序和硬件之间的中间人,硬件中最主要的是CPU,处理应用事件。 有操作系统知道 CPU 正在处理哪个...

  • 探究APP启动流程

    从main函数探究 我们知道main()函数是入口函数,那么我们探究APP的启动流程就先从main函数开始,我们直...

  • iOS-main函数之前

    我们一般知道 App 程序入口从执行main函数开始,但其实在main函数之前程序做了很多工作。 一、内核启动 A...

  • iOS应用程序的加载(一)

    调用在main()之前 一般开发场景中,我们都是把main()函数作为程序的入口,但是这里探究一下man()函数开...

  • iOS main函数知多少

    iOS main函数 一个 iOS App 的 main 函数位于 main.m 中,这是我们熟知的程序入口。但对...

  • iOS App启动过程的探究

    探究App的启动过程,有助于我们优化App的启动时间,从main函数之前和main函数之后两个阶段进行分析一下。 ...

  • iOS 程序 main函数之前发生什么

    主要参考:iOS程序启动->dyld加载->runtime初始化 过程iOS 程序 main 函数之前发生了什么 ...

  • Objective-C Runtime类的加载与初始化(+ lo

    我们知道,iOS App的 main() 函数位于 main.m 中,这是我们熟知的程序入口,但是在这之前, 还要...

  • iOS之UIView

    初识iOS APP开发#### 在iOS APP开发中, main函数仍是程序的入口和出口, 但main函数不需要...

  • (一)iOS程序运行原理

    一、main函数 iOS程序首先由main函数执行,由如上代码可以看到main函数执行后程序进入UIApplica...

网友评论

      本文标题:iOS Main 函数之前探究

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