前言
之前,我们在探索动画及渲染相关原理的时候,我们输出了几篇文章,解答了
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底层原理必然有三大块需要讨论:
-
了解计算机程序工作的原理
-
探索底层原理的前知识
-
基于OC语言探索iOS底层原理
-
基于Swift语言探索iOS底层原理
二、 了解计算机程序工作的原理
1.了解计算机程序工作的过程
之前,在重新了解计算机编译原理的时候,我们曾简单介绍过计算机程序的基本过程。也分别介绍了几种编译型语言,编译型语言
编写的程序在编译阶段的几个工作流程,若您对 程序编译 了解甚少,可以简单从我的这篇文章对其有一个基本的认识:计算机编译原理
计算机程序工作的基本过程:
- 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位系统等的
寄存器
表达也有一定的差异。 - 因此,我们只需要
针对不同的硬件环境
去学习相关的知识点就可以了
- 比如Win、Mac、iOS、Android 、Unix等系统,他们的
- 当然了,若您是一位喜欢钻研底层的优秀选手,也可以凭借个人兴趣去探索一下不同平台的
编译
。
3.了解iOS程序工作的过程
- 做iOS开发的同学们都知道,我们通过
OC/Swift
编写出来的iOS系统的程序,会经过苹果IDE-Xcode
编译
,最后输出 二进制程序 文件:ipa包
- 经过前面的介绍,我们不难得知,我们窥探iOS底层原理的过程中,重点关注整个编译过程即可。
下图是关于iOS的两种语言:Swift、OC在编译器工作的过程基本描述:
高级语言(OC/Swift)-->编译器前端(Clang/SwiftC)-->优化器-->编译器后端(LLVM)-->对应架构(x86、ARM64、armv7)的可执行文件,二进制程序包
4.窥探计算机程序底层的几种方式
从前面的介绍我们得知,我们可以通过汇编
窥探系统的底层原理。当然,我们也可以阅读系统开源的 系统底层源码
来窥探原理。
总结:探究底层原理的方式大概有两种:
阅读源码
(依赖于官方对系统库的开源)汇编
在探究底层原理过程中,我们必须掌握一定的前知识,才具备探究底层原理的手段。因此,我们也需要对相关的前知识有一定的了解:
- 编译链、编译器、汇编指令、寄存器
- 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. 前知识
- 01-探究iOS底层原理|综述
- 02-探究iOS底层原理|编译器LLVM项目【Clang、SwiftC、优化器、LLVM】
- 03-探究iOS底层原理|LLDB
- 04-探究iOS底层原理|ARM64汇编
2. 基于OC语言探索iOS底层原理
- 05-探究iOS底层原理|OC的本质
- 06-探究iOS底层原理|OC对象的本质
- 07-探究iOS底层原理|几种OC对象【实例对象、类对象、元类】、对象的isa指针、superclass、对象的方法调用、Class的底层本质
- 08-探究iOS底层原理|Category底层结构、App启动时Class与Category装载过程、load 和 initialize 执行、关联对象
- 09-探究iOS底层原理|KVO
- 10-探究iOS底层原理|KVC
- 11-探究iOS底层原理|探索Block的本质|【Block的数据类型(本质)与内存布局、变量捕获、Block的种类、内存管理、Block的修饰符、循环引用】
- 12-探究iOS底层原理|Runtime1【isa详解、class的结构、方法缓存cache_t】
- 13-探究iOS底层原理|Runtime2【消息处理(发送、转发)&&动态方法解析、super的本质】
- 14-探究iOS底层原理|Runtime3【Runtime的相关应用】
- 15-探究iOS底层原理|RunLoop【两种RunloopMode、RunLoopMode中的Source0、Source1、Timer、Observer】
- 16-探究iOS底层原理|RunLoop的应用
- 17-探究iOS底层原理|多线程技术的底层原理【GCD源码分析1:主队列、串行队列&&并行队列、全局并发队列】
- 18-探究iOS底层原理|多线程技术【GCD源码分析1:dispatch_get_global_queue与dispatch_(a)sync、单例、线程死锁】
- 19-探究iOS底层原理|多线程技术【GCD源码分析2:栅栏函数dispatch_barrier_(a)sync、信号量dispatch_semaphore】
- 20-探究iOS底层原理|多线程技术【GCD源码分析3:线程调度组dispatch_group、事件源dispatch Source】
- 21-探究iOS底层原理|多线程技术【线程锁:自旋锁、互斥锁、递归锁】
- 22-探究iOS底层原理|多线程技术【原子锁atomic、gcd Timer、NSTimer、CADisplayLink】
- 23-探究iOS底层原理|内存管理【Mach-O文件、Tagged Pointer、对象的内存管理、copy、引用计数、weak指针、autorelease
3. 基于Swift语言探索iOS底层原理
关于函数
、枚举
、可选项
、结构体
、类
、闭包
、属性
、方法
、swift多态原理
、String
、Array
、Dictionary
、引用计数
、MetaData
等Swift基本语法和相关的底层原理文章有如下几篇:
- 01-📝Swift5常用核心语法|了解Swift【Swift简介、Swift的版本、Swift编译原理】
- 02-📝Swift5常用核心语法|基础语法【Playground、常量与变量、常见数据类型、字面量、元组、流程控制、函数、枚举、可选项、guard语句、区间】
- 03-📝Swift5常用核心语法|面向对象【闭包、结构体、类、枚举】
- 04-📝Swift5常用核心语法|面向对象【属性、inout、类型属性、单例模式、方法、下标、继承、初始化】
- 05-📝Swift5常用核心语法|高级语法【可选链、协议、错误处理、泛型、String与Array、高级运算符、扩展、访问控制、内存管理、字面量、模式匹配】
- 06-📝Swift5常用核心语法|编程范式与Swift源码【从OC到Swift、函数式编程、面向协议编程、响应式编程、Swift源码分析】
4. C++核心语法
- 01-📝C++核心语法|C++概述【C++简介、C++起源、可移植性和标准、为什么C++会成功、从一个简单的程序开始认识C++】
- 02-📝C++核心语法|C++对C的扩展【::作用域运算符、名字控制、struct类型加强、C/C++中的const、引用(reference)、函数】
- 03-📝C++核心语法|面向对象1【 C++编程规范、类和对象、面向对象程序设计案例、对象的构造和析构、C++面向对象模型初探】
- 04-📝C++核心语法|面向对象2【友元、内部类与局部类、强化训练(数组类封装)、运算符重载、仿函数、模板、类型转换、 C++标准、错误&&异常、智能指针】
- 05-📝C++核心语法|面向对象3【 继承和派生、多态、静态成员、const成员、引用类型成员、VS的内存窗口】
5. Vue全家桶
- 01-📝Vue全家桶核心知识|Vue基础【Vue概述、Vue基本使用、Vue模板语法、基础案例、Vue常用特性、综合案例】
- 02-📝Vue全家桶核心知识|Vue常用特性【表单操作、自定义指令、计算属性、侦听器、过滤器、生命周期、综合案例】
- 03-📝Vue全家桶核心知识|组件化开发【组件化开发思想、组件注册、Vue调试工具用法、组件间数据交互、组件插槽、基于组件的
- 04-📝Vue全家桶核心知识|多线程与网络【前后端交互模式、promise用法、fetch、axios、综合案例】
- 05-📝Vue全家桶核心知识|Vue Router【基本使用、嵌套路由、动态路由匹配、命名路由、编程式导航、基于vue-router的案例】
- 06-📝Vue全家桶核心知识|前端工程化【模块化相关规范、webpack、Vue 单文件组件、Vue 脚手架、Element-UI 的基本使用】
- 07-📝Vue全家桶核心知识|Vuex【Vuex的基本使用、Vuex中的核心特性、vuex案例】
6. 音视频技术核心知识
- 01-📝音视频技术核心知识|了解音频技术【移动通信技术的发展、声音的本质、深入了解音频】
- 02-📝音视频技术核心知识|搭建开发环境【FFmpeg与Qt、Windows开发环境搭建、Mac开发环境搭建、Qt开发基础】
- 03-📝音视频技术核心知识|Qt开发基础【
.pro
文件的配置、Qt控件基础、信号与槽】 - 04-📝音视频技术核心知识|音频录制【命令行、C++编程】
- 05-📝音视频技术核心知识|音频播放【播放PCM、WAV、PCM转WAV、PCM转WAV、播放WAV】
- 06-📝音视频技术核心知识|音频重采样【音频重采样简介、用命令行进行重采样、通过编程重采样】
- 07-📝音视频技术核心知识|AAC编码【AAC编码器解码器、编译FFmpeg、AAC编码实战、AAC解码实战】
- 08-📝音视频技术核心知识|成像技术【重识图片、详解YUV、视频录制、显示BMP图片、显示YUV图片】
- 09-📝音视频技术核心知识|视频编码解码【了解H.264编码、H.264编码、H.264编码解码】
- 10-📝音视频技术核心知识|RTMP服务器搭建【流媒体、服务器环境】
其它底层原理专题
1. 底层原理相关专题
2. iOS相关专题
- 01-iOS底层原理|iOS的各个渲染框架以及iOS图层渲染原理
- 02-iOS底层原理|iOS动画渲染原理
- 03-iOS底层原理|iOS OffScreen Rendering 离屏渲染原理
- 04-iOS底层原理|因CPU、GPU资源消耗导致卡顿的原因和解决方案