美文网首页runtime系列
类和对象在runtime中的描述

类和对象在runtime中的描述

作者: coldLeon | 来源:发表于2017-11-07 23:04 被阅读0次

类在runtime中的描述如下:

struct objc_class {
    Class _Nonnull isa  OBJC_ISA_AVAILABILITY;
} ;

当然,以上是简化过的,略去了不重要的内容。
再来看下Class的定义

typedef struct objc_class *Class;

合并一下,就能得到下面的等效表达

struct objc_class {
    struct objc_class *isa;
};

那么对象呢?同样,来看描述

struct objc_object {
    Class _Nonnull isa  OBJC_ISA_AVAILABILITY;
};
typedef struct objc_object *id;

Class的定义跟上面类的描述一致,所以也可以合并为

struct objc_object {
    struct objc_class *isa;
};

我们这两个定义放在一起来看下:

struct objc_class {
    struct objc_class *isa;
};
struct objc_object {
    struct objc_class *isa;
};
 
typedef struct objc_class *Class; //类  (class object)
typedef struct objc_object *id;   //对象 (instance of class)

通过上面的声明可以看出,Class是一个指向objc_class结构体的指针,而id是一个指向objc_object结构体的指针,其成员isa是一个指向objec_class结构体的指针。

凡是首地址是*isa的struct指针,都可以被认为是objc中的对象。运行时可以通过isa指针,查找到该对象是属于什么类,也就是当我们向某个对象发送某个消息时,运行时库会根据实例对象的isa指针找到这个实例对象所属的类。Runtime库会在类的方法列表及父类的方法列表中去寻找与消息对应的selector指向的方法。

所有的类自身也是一个对象,我们可以向这个对象发送消息(即调用类方法)。如:

NSString *string = [NSString string];

我们给NSString发送了一个string的消息,也就是可以把NSString也看成是一个对象,那么它就包含一个指向其所属类的指针了,这个指针是指向啥的呢?这就是接下来我们要说的meta-class了。它是一个类对象所属的类。当我们向一个对象发送消息时,runtime会在这个对象所属的这个类的方法列表中查找方法;而向一个类发送消息时,会在这个类的meta-class的方法列表中查找。
好了,又一个问题来了,meta-class也是一个类,也可以向它发送一个消息,那么它的isa又是指向什么呢?为了不让这种结构无限延伸下去,Objective-C的设计者让所有的meta-class的isa指向基类的meta-class,以此作为它们的所属类。即,任何NSObject继承体系下的meta-class都使用NSObject的meta-class作为自己的所属类,而基类的meta-class的isa指针是指向它自己,实在是机智。
根据上面我们讲的,就能得到下面这张经典的类与对象的关系图了,可以比对这张图再重读下上面说的,能理解得更透彻点。


1510064850760.jpg

相关文章

  • 类和对象在runtime中的描述

    类在runtime中的描述如下: 当然,以上是简化过的,略去了不重要的内容。再来看下Class的定义 合并一下,就...

  • Category实现原理

    依赖runtime 动态的将分类的方法和类方法合并到类对象和元类对象的方法列表中 (对实例对象 类对象 元类对...

  • Runtime源码 成员变量与属性

    上篇文章我们了解了类、对象和isa在runtime中的表示,现在来看看runtime对成员变量和属性的处理。在此之...

  • runtime源码中的类和对象

    本文基于objc4-709源码进行分析。关于源码编译:objc - 编译Runtime源码objc4-706 ob...

  • day17面向对象的思想编程

    面向对象 类 面向对象: 类:(用类创建对象) 类的定义:生活中描述实物无非是描述事物的名称/属性和行为如:人的...

  • Runtime小结

    在runtime中一个对象就是用结构体来表示的 runtime中的表示 获取类的属性列表 获取类的成员变量 获取类...

  • iOS runtime

    文章目录 OC中类和对象的本质 实例对象,类,元类的关系 类的属性 类的方法 消息发送机制 Runtime api...

  • 分类Category及对象关联原理

    所有的OC类和对象,在runtime层都是用struct表示的,category也不例外,在runtime层,ca...

  • Runtime源码剖析---图解对象、类与isa

    Runtime源码剖析---图解对象、类与isa 源码面前,了无秘密 在iOS开发的过程中,对象、类应该是我们接触...

  • iOS runtime 应用之给UIButton添加点击事件的

    在之前的一篇文章中已经介绍过, 可以通过 runtime 机制给已有的类"添加"对象属性和非对象属性)[详情]. ...

网友评论

    本文标题:类和对象在runtime中的描述

    本文链接:https://www.haomeiwen.com/subject/cbijpxtx.html