QiuZH's Program Learn | iOS - Runtime 详解
/ / 点击 / 阅读耗时 4 分钟iOS Runtime 详解
前言
Objective-C
语言是一门动态语言。它把一些决策从编译阶段
、链接阶段
推迟到运行时阶段
,实现该机制的基础就是 runtime(又叫作运行时)。
- 静态语言:在编译阶段就已确定所有变量的数据类型,同时也确定要调用的函数,以及函数的实现。常见的静态语言,如:
C/C++
、Java
、C#
等。 - 动态语言:程序在运行时可以改变其结构。也就是说在运行时检查变量数据类型,同时在运行时才会根据函数名查找要调用的具体函数。如
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 Language 和 Declared 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 | struct objc_object { |