介绍
runtime到底是什么?
也有人说“Objective-C是最优美的语言”,那么到底是为什么?
runtime和Objective-C的关系是什么样的?
runtime有什么作用,具体能干什么?
runtime的原理是什么,什么是消息机制?
runtime的使用需要注意什么?
一下我们将围绕这几个问题展开来做介绍。
runtime是什么
在上一篇博客中说道runtime 是运行时库,其实这样去介绍是不全面的,runtime可以理解为运行时编程,也就是说我们在程序运行也就是编译完成时,还可以对程序进行修改。就说强大不强大吧!
我们都知道Objective-C时基于C语言使用面向对象的思想进行封装,也就是说把面向过程的C语言封装成了面向对象语言。我们要研究运行时,那么我们从成地方开始呢? 运行时特性是怎么来的呢?
我们来想任何一门语言开发出来的程序,要被执行都要被编译成机器识别的语言,也就是由0和1组成的汇编语言。那么Objective-C程序在编译过程中经历了什么?
Objective-C基于C语言,在编译过程中首先会编译为C语言,然后在编译为可执行文件。没错,我们在OC中所有的类、方法、属性都会编译为C语言的结构体,而runtime在C语言中可以动态改变这些结构体,也就改变了OC中的类、方法和属性。
Objective-C中的类
我们都知道我们类Class,我们使用Commend + 点击 进去查看
typedef struct objc_class *Class;
使用 typedef 给结构体 objc_class 起了别名为Class,同样id也是这样。我们继续看objc_class的定义
struct objc_class {
Class isa OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
Class super_class OBJC2_UNAVAILABLE;
const char *name OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
long instance_size OBJC2_UNAVAILABLE;
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;
struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
struct objc_cache *cache OBJC2_UNAVAILABLE;
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;
#endif
} OBJC2_UNAVAILABLE;
这个时候我们可以清晰看到,我们实例化一个类其实就是说我们最终得到的是一个objc_class的结构体指针。同样id类似于Class也是一个重定义objc_object的结构体。
typedef struct objc_object *id;
truct objc_object {
Class isa OBJC_ISA_AVAILABILITY;
};
那么我们就要思考了,我们在OC中的属性和方法,是以什么样的形式存在的呢,我们现在知道我们实例化的类最后都是objc_class的结构体指针,我们来分析一下这个结构体(objc_class)
Class isa OBJC_ISA_AVAILABILITY;
- 指向元类(metaclass)的指针。元类保存了类方法的列表
Class super_class
- 这看字面意思就知道,指向父类的指针
const char *name
- name类的名称
long version
- 版本,具体有什么用呢?
long info
- 信息,类的基本介绍
long instance_size
- 实例变量大小
struct objc_ivar_list *ivars
- 成员变量列表
struct objc_method_list **methodLists
- 方法列表
struct objc_cache *cache
- cache缓存,缓存最近使用的方法指针便于查找
struct objc_protocol_list *protocols
- 协议列表
通过以上的介绍是不是一个objc_class这样的就够提就包含了我们类的全部内容了,其中的isa指针我们在后面详细的介绍。