runtime的简析

类和对象

Objective-C语言是一门动态语言,他将不少静态语言在编译和连接时期作的事放到了运行时来处理。这种动态语言的优点在于:咱们写代码的时候更具灵活性,如咱们能够把消息转发给咱们想要的对象,或者随意交换一个方法的实现等。

这种特性意味着Objective-C不只须要一个编译器,还须要一个运行时系统来执行编译的代码。对于OC来讲,这个运行时系统就像一个操做系统同样:他让全部的工做能够正常的运行,这个运行时系统就是Obj Runtime。Obj Runtime其实就是一个Rumtime库,他基本是用C和OC汇编写的,这个库使得C语言有了面向对象的能力。

Runtime库主要作下面几件事:

封装:在这个库中,对象能够用C语言中的结构体表示,而方法能够用C函数来实现,另外再加上了一些额外的特性。这些结构体和函数被runtime函数封装后,咱们就能够在程序运行时建立,检查,修改类、对象和它们的方法了。

找出方法的最终执行代码:当程序执行[object doSomething]时,会向消息接收者(object)发送一条消息(doSomething),runtime会根据消息接收者是否能响应该消息而作出不一样的反应。这将在后面详细介绍。

Objective-C runtime目前有两个版本:Modern runtime和Legacy runtime。Modern Runtime 覆盖了64位的Mac OS X Apps,还有 iOS Apps,Legacy Runtime 是早期用来给32位 Mac OS X Apps 用的,也就是能够不用管就是了。

在这一系列文章中,咱们将介绍runtime的基本工做原理,以及如何利用它让咱们的程序变得更加灵活。在本文中,咱们先来介绍一下类与对象,这是面向对象的基础,咱们看看在Runtime中,类是如何实现的。

类与对象基础数据结构

Class

Objective-C类是由Class类型来表示的,它其实是一个指向objc_class结构体的指针。它的定义以下:

typedef struct objc_class *Class;缓存

查看objc/runtime.h中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;  // 类的版本信息,默认为0
    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;
相关文章
相关标签/搜索