01-探究iOS底层原理|综述

2,129 阅读13分钟

前言

之前,我们在探索动画及渲染相关原理的时候,我们输出了几篇文章,解答了iOS动画是如何渲染,特效是如何工作的疑惑。我们深感系统设计者在创作这些系统框架的时候,是如此脑洞大开,也 深深意识到了解一门技术的底层原理对于从事该方面工作的重要性。

因此我们决定 进一步探究iOS底层原理的任务,并以本文作为综述,对各个底层原理探究的模块进行概要总结,从而引出各个子模块底层原理探究的分述(详述)

一、概述

1.目前开发iOS客户端的技术栈

我们现在开发iOS应用的技术栈方案大概有几种:

  • Native原生(以OC、Swift为主,同时支持C、CPP、OC、Swift等混编)
  • 跨平台开发
    • MobileWeb App
    • 类RN技术
    • Flutter等
  • Hybrid(Native+跨平台技术)

我们本次探究iOS底层原理

  • 关注的要点是原生技术栈中的OC、Swift两门语言相关底层原理
  • 不对跨平台方案、Hybrid开发方案中涉及到的其它技术栈进行展开讨论

2.探索系统底层原理的前知识

我们探索底层原理,本质上是探索Native环境下,编程语言 表层语法的底层实现 ,包括 数据结构算法 的实现 和 相关的运作机制等。

因此,我们探索底层原理就是要掌握计算机程序的整个工作过程、在工作过程中不同的阶段的过程表达物等。

为了探索这些底层工作过程,以及理解相关的过程产物,我们也需要掌握与之相关的前知识。具备探索底层原理的能力,掌握探索底层原理的几种手段

3.探索系统底层原理的整体篇幅

因此,我们探索iOS底层原理必然有三大块需要讨论:

    1. 了解计算机程序工作的原理
    1. 探索底层原理的前知识
    1. 基于OC语言探索iOS底层原理
    1. 基于Swift语言探索iOS底层原理

二、 了解计算机程序工作的原理

1.了解计算机程序工作的过程

之前,在重新了解计算机编译原理的时候,我们曾简单介绍过计算机程序的基本过程。也分别介绍了几种编译型语言,编译型语言编写的程序在编译阶段的几个工作流程,若您对 程序编译 了解甚少,可以简单从我的这篇文章对其有一个基本的认识:计算机编译原理

计算机程序工作的基本过程:

image.png

  • 1.在日常开发过程中,程序员编写的程序一般采用高级语言编写,然后存放在硬盘
  • 2.当我们在IDE中 运行 编写好的程序 ,程序就会通过编译,生成二进制可执行文件 装载到内存
  • 3.二进制程序在内存中运行,一般都有基于该类型高级语言编写的执行环境,如:
    • Java的JVM
    • OC/Swift的runtime
    • Node.js的Node
    • 运行在Chrome中的H5其运行环境Chrome的V8引擎
    • 运行在Safari中的H5其运行环境Safari的JavaScriptCore
    • ......
  • 4.二进制程序在内存中运行过程中,其计算和控制一般由CPU处理,若有关于图形界面处理的逻辑,还会牵扯到GPU
  • 5.二进制程序可以通过CPU控制计算机的硬件器件:显示器、音响、键盘、话筒、蓝牙等....

从前面介绍的知识,我们可以了解到 从计算机程序编写,到其二进制程序 的基本工作的过程。由此,我们得知,要去深入了解一个系统的底层原理,需要进一步认识 编译过程

2.编译

  • 从我的这篇文章计算机编译原理我们可以知道,编译需要了解 编译器(编译器前端优化器、编译器后端);
  • 并且,编译器的过程产物中间代码汇编指令寄存器 等参与工作。要探索底层原理,我们也需要去认识 上述 几个概念 和相关的知识;
  • 有计算机功底的朋友一定知道,汇编指令寄存器编译过程 是极其 依赖 硬件环境的
    • 比如Win、Mac、iOS、Android 、Unix等系统,他们的 编译过程 都相似,但是汇编指令寄存器却不太相同;
    • 对于同一款硬件的操作系统,64位系统、32位系统等的寄存器表达也有一定的差异。
    • 因此,我们只需要针对不同的硬件环境去学习相关的知识点就可以了
  • 当然了,若您是一位喜欢钻研底层的优秀选手,也可以凭借个人兴趣去探索一下不同平台的编译

3.了解iOS程序工作的过程

  • 做iOS开发的同学们都知道,我们通过OC/Swift编写出来的iOS系统的程序,会经过苹果IDE-Xcode 编译,最后输出 二进制程序 文件: ipa包
  • 经过前面的介绍,我们不难得知,我们窥探iOS底层原理的过程中,重点关注整个编译过程即可。

下图是关于iOS的两种语言:Swift、OC在编译器工作的过程基本描述: image.png

高级语言(OC/Swift)-->编译器前端(Clang/SwiftC)-->优化器-->编译器后端(LLVM)-->对应架构(x86、ARM64、armv7)的可执行文件,二进制程序包

4.窥探计算机程序底层的几种方式

从前面的介绍我们得知,我们可以通过汇编窥探系统的底层原理。当然,我们也可以阅读系统开源的 系统底层源码来窥探原理。
总结:探究底层原理的方式大概有两种:

  1. 阅读源码(依赖于官方对系统库的开源)
  2. 汇编

在探究底层原理过程中,我们必须掌握一定的前知识,才具备探究底层原理的手段。因此,我们也需要对相关的前知识有一定的了解:

  • 编译链、编译器、汇编指令、寄存器
    • LLVM项目
    • 编译器前端:Clang&&SwiftC
    • 编译器后端LLVM
    • 汇编
    • x86汇编
    • ARM汇编
  • LLDB

三、 基于OC语言探索iOS底层原理

我们的面向对象语言OC的类,都是继承自NSObject,并且OC语言有很多其自身的语法。因此,我们窥探OC语言底层原理也是基本围绕 OC语法OC的基类来窥探的。
我们会围绕以下几个知识点进行底层原理的探究:

  • OC的本质
  • OC对象的本质(Objective-C中的对象,简称OC对象,主要可以分为3种 )
  • OC对象的分类
    • instance对象(实例对象)
    • class对象(类对象)
      • Class的底层结构
    • meta-class对象(元类对象)
  • isa指针
  • KVO
  • KVC
  • Category
  • Block
  • 关联对象
  • Runtime
  • RunLoop
  • 多线程
  • 内存管理

四、 基于Swift语言探索iOS底层原理

同样的,我们探索Swift语言的底层原理,也是围绕其语法特性一些常用类展开的!
我们会围绕以下几个知识点进行底层原理的探究:

  • 内联优化
  • 枚举
  • 结构体、类
  • 闭包
  • 属性、方法、下标、继承
  • 多态原理、init
  • String
  • Array

总结

通过通篇介绍,我们了解了计算机程序工作的基本过程,了解到我们探究底层原理 要去 对 编译过程 有一定的认识。了解到,探索iOS底层原理,是围绕 语言的 一些基类 、语法特性、运行时环境开展的。因此,我们接下来有以下篇幅,展开对底层原理的窥探:

专题系列文章

1. 前知识

2. 基于OC语言探索iOS底层原理

3. 基于Swift语言探索iOS底层原理

关于函数枚举可选项结构体闭包属性方法swift多态原理StringArrayDictionary引用计数MetaData等Swift基本语法和相关的底层原理文章有如下几篇:

4. C++核心语法

5. Vue全家桶

6. 音视频技术核心知识

其它底层原理专题

1. 底层原理相关专题

2. iOS相关专题

3. webApp相关专题

4. 跨平台开发方案相关专题

5. 阶段性总结:Native、WebApp、跨平台开发三种方案性能比较

6. Android、HarmonyOS页面渲染专题

7. 小程序页面渲染专题