iOS Runtime 详解

前言

Objective-C 语言是一门动态语言。它把一些决策从编译阶段链接阶段推迟到运行时阶段,实现该机制的基础就是 runtime(又叫作运行时)。

  • 静态语言:在编译阶段就已确定所有变量的数据类型,同时也确定要调用的函数,以及函数的实现。常见的静态语言,如:C/C++JavaC#等。
  • 动态语言:程序在运行时可以改变其结构。也就是说在运行时检查变量数据类型,同时在运行时才会根据函数名查找要调用的具体函数。如 Objective-C

一、Runtime 是什么

Runtime 提供的接口基本都是 C 语言,源码由C\C++\汇编语言编写。Runtime API为 Objective-C 语言的动态属性提供支持,充当一种用于 Objective-C 语言的操作系统,使得该语言正常运转工作。

二、Runtime 的版本和平台

在不同平台上有不同版本的 Objective-C Runtime

2.1 Versions

Objective-C运行时有两个版本modern(现代版本)legacy(旧版本)。现代版本是在 Objective-C 2.0 中引入的,其中包括许多新功能。旧版运行时的编程接口在 Objective-C 1.0 运行时参考中有所描述;Objective-C Runtime Reference 中描述了现代版本的运行时的编程接口。

最值得注意的新功能是现代运行时中的实例变量是non-fragile(非脆弱的)

  • 在旧版运行时中,如果更改类中实例变量的布局,则必须重新编译从其继承的类。
  • 在现代运行时中,如果更改类中实例变量的布局,则不必重新编译从其继承的类。

另外,现代的运行时支持声明的属性的实例变量综合(请参见 The Objective-C Programming LanguageDeclared Properties

2.2 Platforms

OS X v10.5及更高版本上的iPhone应用程序和64位程序使用现代版本的 Runtime。
其他程序(OS X桌面上的32位程序)使用运行时的旧版本。

三、isa 详解

学习 Runtime,必绕不开 Runtime 底层常用的数据结构,比如 isa 指针。

  • 在arm64架构之前,isa就是一个普通的指针,存储着Class、Meta-Class对象的内存地址;
  • 从arm64架构开始,对isa进行了优化,变成了一个共用体(union)结构,还使用位域来存储更多的信息。
1
2
3
4
5
6
struct objc_object {
private:
isa_t isa;
public:
...
}

3.1

参考

Objective-C Runtime Programming Guide

Objective-C Runtime Reference