浅谈OC运行时(RunTime)

常说OC是一门动态语言,这使得OC开发可以变得相当灵活,但是归根结底OC还是一种编译型的语言,其具有一定的动态性,但是其动态特性也比不上JavaScript这种解释型的语言。OC的动态性主要体现在这个文件中,下面我们打开这个文件,对其总结一下。

一、基本结构及其继承关系

要谈runtime首先必然要先了解OC的对象以及类的结构,这非常有助与我们理解其动态性。

首先我们打开<objc/objc.h>文件,可以看到如下定义:

/// An opaque type that represents an Objective-C class.
typedef struct objc_class *Class;

/// Represents an instance of a class.
struct objc_object {
Class isa OBJC_ISA_AVAILABILITY;
};

/// A pointer to an instance of a class.
typedef struct objc_object *id;

通过上面定义我们可以看出以下几点:

  • 我们常用的id类型实际上一个指向objc_object结构体的指针,id通常指代一个对象,也就是说OC对象其实就一个指向objc_object结构体的指针
  • 我们看objc_object结构体定义,得知其结构体内有一个类型为Class的字段isa,这就是我们常说的isa指针了。
  • 再来看Class的声明,为一个指向objc_class的指针,
  • 实际上isa就是指明当前结构体所属类型,我们可以理解为objc_object为Class类型的

Read More