美文网首页
iOS底层剖析 objc_class结构

iOS底层剖析 objc_class结构

作者: 困惑的柴火 | 来源:发表于2019-07-22 23:33 被阅读0次

iOS中不管类对象还是元类对象类型都是Class,而Class的结构则是objc_class结构体

typedef struct objc_class *Class;

1.OBJC1 objc_class结构(过时)

头文件 #import <objc/runtime.h>内看到的objc_class结构为:


struct objc_class {
    Class _Nonnull isa  OBJC_ISA_AVAILABILITY;  //isa指针
    
#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 *` */

2.OBJC2 objc_class结构

可以在https://opensource.apple.com/source/objc4/objc4-723/中下载和查看开源的最新版本的Runtime库源代码。Runtime库的源代码是用汇编和C++混合实现的,你可以在头文件objc-runtime-new.h中看到关于struct objc_class结构的详细定义。
查看代码你会发现,objc_class继承自objc_object,在头文件objc-private.h中看到关于objc_object结构的详细定义。
因为这是通过c++实现的,所以结构体内会包含函数。
objc_class的结构体内的data反回了一个class_rw_t的结构体指针,而这个指针的结构是:


struct class_rw_t {
    uint32_t flags;
    uint32_t version;

    const class_ro_t *ro;

    method_array_t methods;
    property_array_t properties;
    protocol_array_t protocols;

    Class firstSubclass;
    Class nextSiblingClass;

    char *demangledName;

    void setFlags(uint32_t set) 
    {
        OSAtomicOr32Barrier(set, &flags);
    }

    void clearFlags(uint32_t clear) 
    {
        OSAtomicXor32Barrier(clear, &flags);
    }

    // set and clear must not overlap
    void changeFlags(uint32_t set, uint32_t clear) 
    {
        assert((set & clear) == 0);

        uint32_t oldf, newf;
        do {
            oldf = flags;
            newf = (oldf | set) & ~clear;
        } while (!OSAtomicCompareAndSwap32Barrier(oldf, newf, (volatile int32_t *)&flags));
    }
};

而class_rw_t是通过bits调用data方法得来的,我们来到data方法内部实现。我们可以看到,data函数内部仅仅对bits进行&FAST_DATA_MASK操作

class_rw_t* data() {
        return (class_rw_t *)(bits & FAST_DATA_MASK);
    }

成员变量信息则是存储在class_ro_t内部中的,我们来到class_ro_t内查看。
class_ro_t结构体:

struct class_ro_t {
    uint32_t flags;
    uint32_t instanceStart;
    uint32_t instanceSize;
#ifdef __LP64__
    uint32_t reserved;
#endif

    const uint8_t * ivarLayout;
    
    const char * name;
    method_list_t * baseMethodList;
    protocol_list_t * baseProtocols;
    const ivar_list_t * ivars;

    const uint8_t * weakIvarLayout;
    property_list_t *baseProperties;

    method_list_t *baseMethods() const {
        return baseMethodList;
    }
};

class_rw_t 表示read write,class_ro_t 表示 read only。

通过以上分析可以得到objc_class的结构类图:

image
图片最左边显示的内容有一个编辑错误,不应该是NSObject而应该是objc_class。

文章引用链接:
1.https://www.jianshu.com/p/df6629ec9a25
2.https://www.jianshu.com/p/4f732bd01f27
文章2有证明过程,这里不再赘述

相关文章

  • iOS底层剖析 objc_class结构

    iOS中不管类对象还是元类对象类型都是Class,而Class的结构则是objc_class结构体 1.OBJC1...

  • iOS底层之cache_t探究

    我们在iOS底层之类的结构分析分析了类的内部结构,而类的C/C++底层实际是objc_class结构体,其中包含了...

  • iOS底层 - cache原理分析

    iOS开发底层探究之路 在对Objective-C底层的探究过程中,已经探究过objc_class 结构中的isa...

  • iOS objc_class 中的 cache__t 结构

    iOS objc_class 中的 cache__t 结构 我们来看下源码的底层定义 cache_t cache;...

  • 『ios』struct objc_class底层结构

    类的结构是什么呢?来看看类的底层结构吧。如果你之前理解错了,来看看这里。

  • iOS-OC底层06:cache方法缓存

    前沿 对象的底层实现是结构体objc_object,类的底层实现是结构体objc_class,因为objc_cla...

  • cache_t 原理分析

    在前面 iOS 类的结构分析 分析了 objc_class 的 bits, 今天我们来分析 objc_class ...

  • Objective-C中Class的本质

    类(class)和元类(meta-class)底层都是 objc_class 结构体的指针,内存中就是结构体。 之...

  • KVC

    KVC原理剖析 - CocoaChina_让移动开发更简单 iOS开发底层细究:KVC和KVO底层原理 | iOS...

  • [iOS]2、类的原理

    1、class的底层结构探究 通过如下代码进行 class 的结构调试 补充:1、objc_class 继承自 o...

网友评论

      本文标题:iOS底层剖析 objc_class结构

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