美文网首页selector
【iOS】objc_object objc_class

【iOS】objc_object objc_class

作者: Jeanine_Zhou | 来源:发表于2020-08-20 19:03 被阅读0次

runtime的核心是消息传递,介绍消息传递都会讲到对象、类、isa指针这些概念,来表述消息是如何转发的。本文直接从objc_objectobjc_class结构体入手,介绍以上概念。供自己学习记录并为同样迷惑的人儿解一丢丢惑。

objc_object

objc_object就是OC中对象object的c语言定义,可以看到对象就是一个结构体

/// 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;

此结构体内有一个isa成员变量,其类型为Class,那么Class是什么类型?我们下一小节介绍。先看一下在OC中常用的一个通用类型id,最初写代码的时候有没有疑惑过为什么声明id类型的变量不用加上*,因为它本身就是一个指针,是一个指向objc_object的指针。

objc_class

Class类型其实就是指向objc_class结构体的指针,objc_class结构体里存储了父类、方法列表等信息:

/// An opaque type that represents an Objective-C class.
typedef struct objc_class *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;

实例对象、类对象、元类

objc_class结构里也有isa指针,可以发现其实类也是一种对象,那什么是类对象。直接看代码,p就是实例对象,p1、p2都是类对象

Person *p = [[Person alloc] init];
Class p1 = [p class];
Class p2 = [Person class];

p1是通过实例对象获取到其类对象,p2是通过类名,类名作为消息的接收者时代表的是类对象,类对象获取Class得到的是其本身。

实例对象(objc_object)结构体中isa指针指向的是类对象(objc_class)结构体,类对象中保存的是创建实例对象、方法的一些信息。类对象(objc_class)中的isa则是指向一个叫做元类(meta-class)的(objc_class)结构体,元类中存储这创建类对象和类方法的信息。那么元类中还有isa指针,又指向哪?我们放出经典图(Runtime 工程师 Greg Parker 在他的博客贴出的图表)

image.png
Objective-C 的创建者让所有元类的isa指针指向根元类,根元类的isa指针指向自身。

至此,应该可以清楚的理解实例对象、类、元类的关系了叭!(以上若有理解错误或描述错误欢迎各位大佬赐教~)

相关文章

  • 4、objc_class结构解析

    一、 objc_class & objc_object 类 objc_class 继承于 objc_object ...

  • Runtime 中 objc_class , objc_obje

    objc_class , objc_object, objc_category 结构 objc_class 结构 ...

  • 类与对象

    目前iOS中,objc_class与objc_object使用的是后两个定义。 struct objc_class...

  • iOS runtime详细内容

    一. objc_object结构体 objc_class结构体 1.1 objc_object结构体 isa指针...

  • class结构

    摘出重要的部分,objc_class 是继承 objc_object 结构体 objc_object 有 isa ...

  • RunTime

    数据结构 objc_object objc_class isa指针 method_t objc_object id...

  • 【iOS】objc_object objc_class

    runtime的核心是消息传递,介绍消息传递都会讲到对象、类、isa指针这些概念,来表述消息是如何转发的。本文直接...

  • OC类

    objc_class的结构 objc_class 继承与 objc_object 所有对象都是以objc_obje...

  • 类初始化过程

    struct objc_class : objc_object {// Class ISA;Class super...

  • Runtime之runtime解析

    OC中类的源码 objc_object 源码 isa_t 源码 objc_class 源码 objc_class继...

网友评论

    本文标题:【iOS】objc_object objc_class

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