05-探究iOS底层原理|OC的本质

4,076 阅读14分钟

前言

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

因此我们决定 进一步探究iOS底层原理的任务 ,本文探索的底层原理围绕“OC的本质”展开

一、概述

我们在这篇文章(探究iOS底层原理|综述)上曾提到,探索iOS底层原理,是需要在掌握一定的前知识的情况下,针对Native开发的编程语言:OCSwift 分别探索其底层原理的,且介绍了探索底层原理的方式有两种:

  • 1.基于汇编
  • 2.基于源码

我们在本文将开始针对Objective-C开展底层原理的探索。
本文首先探索Objective-C语言的本质,然后再一步一步针对Objective-C语言的语法,围绕其底层设计与内存布局等去探索底层原理!

二、Objective-C简介

1.OC语言简介

2.OC语言的历史

Objective-C 主要由  Stepstone 公司的 布莱德·考克斯(Brad Cox)和 汤姆·洛夫(Tom Love) 在 1980 年代发明。

1981年 Brad Cox 和 Tom Love 还在 ITT 公司 技术中心任职时,接触到了 SmallTalk语言。Cox 当时对软件设计和开发问题非常感兴趣,他很快地意识到 SmallTalk语言 在系统工程构建中具有无法估量的价值,但同时他和 Tom Love 也明白,目前ITT 公司 的电子通信工程相关技术中,C 语言被放在很重要的位置。

于是 Cox 撰写了一个 C 语言的预处理器,打算使 C 语言具备些许 Smalltalk 的本领。Cox 很快地实现了一个可用的 C 语言扩展,此即为 Objective-C语言的前身。到了 1983 年,Cox 与 Love 合伙成立了 Productivity Products International(PPI)公司,将 Objective-C 及其相关库商品化贩售,并在之后将公司改名为StepStone。1986年,Cox 出版了一本关于 Objective-C 的重要著作《Object-Oriented Programming, An Evolutionary Approach》,书内详述了 Objective-C 的种种设计理念。

1988年,斯蒂夫·乔布斯 (Steve Jobs)离开苹果公司后成立了 NeXT Computer 公司,NeXT 公司买下 Objective-C 语言的授权,并扩展了著名的开源编译器GCC使之支持 Objective-C 的编译,基于 Objective-C 开发了AppKit Foundation Kit 等库,作为 NeXTSTEP 的的用户界面与开发环境的基础。虽然 NeXT 工作站后来在市场上失败了,但 NeXT 上的软件工具却在业界中被广泛赞扬。这促使 NeXT 公司放弃硬件业务,转型为销售NeXTStep(以及OpenStep)平台为主的软件公司。

1992年,自由软件基金会的 GNU 开发环境增加了对 Objective-C 的支持。1994年,NeXT Computer公司和Sun Microsystem联合发布了一个针对 NEXTSTEP 系统的标准典范,名为 OPENSTEP。OPENSTEP 在自由软件基金会的实现名称为 GNUstep 。1996年12月20日,苹果公司 宣布收购 NeXT Software 公司,NEXTSTEP/OPENSTEP环境成为苹果操作系统下一个主要发行版本OS X的基础。这个开发环境的版本被苹果公司称为Cocoa

2005年,苹果电脑雇用了克里斯·拉特纳"克里斯·拉特纳")及LLVM开发团队,ClangLLVM成为苹果公司在GCC之外的新编译器选择,在 Xcode 4.0之后均采用 LLVM 作为默认的编译器。最新的 Modern Objective-C 特性也都率先在 Clang 上实现。

3.苹果官方对Objective-C的介绍

image.png

它第一段落 表达的意思就是:

  • Objective-C是程序员在为OS X和iOS编写软件时使用的主要编程语言(之一,现在已经还有Swift语言)。
  • 是C编程语言的超集,提供面向对象的功能和动态运行时。
  • Objective-C继承了C语言的语法基本类型流控制语句,并添加了用于定义类和方法的语法。(OC完全兼容标准C语言)
  • 它还增加了面向对象管理和对象字面量的语言级别支持,同时提供动态类型和绑定,将许多责任推迟到运行时

官方的其余介绍可以访问:官方地址

4.Objective-C语言的变化

1. Objective-C++

Objective-C++GCC的一个前端,它可以编译混合了C++Objective-C语法的源文件。Objective-C++C++的扩展,类似于Objective-CC的扩展。由于在融合C++,因此有以下限制:与Objective-C两种语言的特性方面没有做特别的工作

  • C++类不能从Objective-C类继承,反之亦然。
  • Objective-C定义内部不能定义C++名字空间。
  • Objective-C类的成员变量不能包括不含默认构造函数和/或含有虚方法的C++类对象,但使用C++类指针并无如此限制(可以在 -init方法中对之进行初始化)。
  • C++“传递值”的特性不能用在Objective-C对象上,而只能传递其指针。
  • Objective-C声明不能存在在C++模板声明中,反之亦然。但Objective-C类型可以用在C++模板的参数中。
  • Objective-C和C++的错误处理语句不同,各自的语句只能处理各自的错误。
  • Objective-C错误使得C++对象被退出时,C++析构函数不会被调用。新的64位运行时解决了这个问题。[6]

Objective-C++ 的 出现 使得 Native iOS 的底层中 包含了 C++的实现

2. Objective-C 2.0

在2006年7月苹果全球开发者会议中,Apple宣布了“Objective-C 2.0”的发布,其增加了“现代的垃圾收集,语法改进,运行时性能改进,以及64位支持”。2007年10月发布的Mac OS X v10.5中包含了Objective-C 2.0的编译器

5.总结

  • Objective-C 的底层 为 C 语言 的扩展,完全支持标准 C
  • Objective-C++ 底层 为 C++ 的扩展
  • 我们通常可以概括为:OC(包含Objective-C、Objective-C++)的底层实现就是 C、C++

三、了解OC语言的设计

我们从前面的篇幅可以知道,OC在承继了 C语言 的 语法、基本类型、流程控制 之外,提供了面向对象、运行时特性、类和对象的语法,提供了消息机制等。
而我们也可以通过IDE看到部分objc系统库包中,开放的一些头文件。 image.png

image.png

虽然,Objective-C是一门闭源的语言,但官方也对该语言有了适当的开源。我们通常可以通过该地址去查找苹果官方开源的一些源码:opensource.apple.com/tarballs/

image.png

我们全局搜索 objc,可以找到objc4,然后下载最新的开源版本代码即可 image.png

我们从官方开源的代码中也可以看到,OC底层的实现: image.png (Tips:以.mm为后缀的文件,是C++语言的实现文件)

探索到这里,我们也得知,若是我们要去探索iOS底层原理,需要具备 C、C++语言的一定功底

未深入探索的问题

我们在前面了解到 OC 底层实现的技术栈,也下载到了官方开源的代码,但是并未拓展开来介绍官方开源代码。对OC语言的设计细节,若是同学们感兴趣,可以自行下载官方开源的代码,针对自己想了解的部分去阅读。本文不铺展开来一一介绍所有的开源代码,仅作为一个引子,为后面的几篇文章中,若探索底层原理有需要才会针对特定源码进行探索。

总结

通过通篇介绍,我们了解了 OC语言的 基本特点、发展历史、以及底层实现技术栈。本文将作为一个引子,支撑我们接下来对底层原理探索:

专题系列文章

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. 小程序页面渲染专题