利用runtime理解OC特性(1)

最近在深入的去理解ocruntime机制,我觉得它就像是和C的一个桥梁。为什么这么说呢?大家都知道高级编程语言都需要编译为汇编语言在编译为机器语言变为可执行文件,但是OC并不能直接编译为汇编语言,需要先转换为C。而OCC的过渡,依赖的就是runtime。所以runtime的重要性就不言而喻了。

OC的对象和类 —> C结构体

在刚接触OC时,有这些词基本随时都要打交道:
-类
-父类
-元类
-对象
-类对象
-实例对象
接下来将会让你完全理解这些名词之前的关系,我们通过可以发现有这些代码

#if !OBJC_TYPES_DEFINED
/// An opaque type that represents an Objective-C class.
///不透明的类型,表示Objective-C类。
typedef struct objc_class *Class;

/// Represents an instance of a class.
///表示一个类的实例。
struct objc_object {
    Class _Nonnull isa  OBJC_ISA_AVAILABILITY;
};

/// A pointer to an instance of a class.
///指向类实例的指针。
typedef struct objc_object *id;
#endif

不难看出,类对象Class就是struct objc_class结构体,所谓的实例对象,其实就是一个struct objc_object结构体,其中的isa就是指向类对象的指针,id就是指向这个结构体的指针。

在深入看一下objc_class这个结构体

struct objc_class {
    Class _Nonnull isa  OBJC_ISA_AVAILABILITY;

#if !__OBJC2__
    Class _Nullable super_class                              OBJC2_UNAVAILABLE;
    const char * _Nonnull name                               OBJC2_UNAVAILABLE;
    long version                                             OBJC2_UNAVAILABLE;
    long info                                                OBJC2_UNAVAILABLE;
    long instance_size                                       OBJC2_UNAVAILABLE;
    struct objc_ivar_list * _Nullable ivars                  OBJC2_UNAVAILABLE;
    struct objc_method_list * _Nullable * _Nullable methodLists                    OBJC2_UNAVAILABLE;
    struct objc_cache * _Nonnull cache                       OBJC2_UNAVAILABLE;
    struct objc_protocol_list * _Nullable protocols          OBJC2_UNAVAILABLE;
#endif

} OBJC2_UNAVAILABLE;
/* Use `Class` instead of `struct objc_class *` */

其中包括了一个Class类型的super_class,也就是父类,以及名字、版本、信息、大小、方法列表、缓存等等。这也就是我们平时用到的类的这些信息了。并且这个结构体存放的数据我们称为元数据(metadata),那么显然这个isa指针指向的就是元类的Class
至此这些名词已经全部解释清楚,整理一下可以得到这样一个图

利用runtime理解OC特性(1)_第1张图片
image.png

到这里基本也就清楚了OC里面类和对象这些关系了。

你可能感兴趣的:(利用runtime理解OC特性(1))