美文网首页
isa 和superClass指针(2)

isa 和superClass指针(2)

作者: 豆豆哥哥 | 来源:发表于2020-09-12 17:58 被阅读0次
    在objc4-781 的源码中

    在最新的iOS 64架构中
    isa 指针有64个字节,为共用体


    image.png
    nonpointer        是不是非指针类型的,若是指针类型的里面放的值就是指向类对象或者元类,或者根元类的地址,
    has_assoc       有没有关联对象相关的  
    has_cxx_dtor      有没有C++或者是MRC相关的
    shiftcls         非指针类型的这部分存的就是 类对象或者元类,或者根元类的地址,
    magic             调试器相关的
    weakly_referenced   有没有弱应用相关的
    deallocating      标识有没有正在释放
    has_sidetable_rc   引用有没有引用计数标
    extra_rc         存的是引用计数器,操作原理是:先优先操作这里面的引用计数,再操作引用计数表中的,若为0 会把引用表中的放在这里面,若满了会放在表中,但每次都会保留1半。
    
    知识点:

    即实例对象通过isa指针找类对象时 - isa指针需& 上ISA_MASK 才能找到真实的地址。

    类的结构关系

    @interface NSObject <NSObject> {
    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wobjc-interface-ivars"
        Class isa  OBJC_ISA_AVAILABILITY;
    #pragma clang diagnostic pop
    }
    

    什么是class呢

    typedef struct objc_class *Class;
    typedef struct objc_object *id;
    
    2个基本概念 objc_object objc_class
    objc_object的结构.png objc_class的结构.png
    
    所以 id 类型是  objc_object
    Class 是 objc_class
    objc_class 继承 objc_object,objc_object中有isa指针,objc_class中有superClass 指针  - 
    superClass 放的就是父类类对象的地址或者父类元对象的地址。是个指针类型,
    isa 一般为非指针类型的。
    (C++中结构体是可以继承的 )
    
    isa_t    共用体
    
    
    上面说了isa superclass 那现在说 cache 和bits

    在iOS的源码中定义属性类型后跟_t的都表示是表table的意思。
    即cache_t cache 、class_data_bits_t bits 都是表。

    ache_t cache

    以前是缓存指针和vtable 缓存的方法列表,就是一个可增容的hashtable吧。 每次增容就需要清空以前缓存的方法。

    class_data_bits_t bits:

    主要是对class_rw_t的封装


    image.png image.png

    说明下class_rw_t 中的 protocols properties methods,是二维数组,里面放的就是分类中的协议、 属性、方法,每1个分类就是1个数组,先编译的分类就先放在二维数组的前面。
    那还有呢-若分类中的关联对象在哪能,你这不对吧。😝

    class_ro_t 那就是类的本体了,类名,方法列表,属性、成员变量、协议列表,都是1维的了。

    知识点总结到1张图
    image.png

    有了这张图那 iOS中类的关系就明确了。
    有什么不对的地方欢迎斧正。

    相关文章

      网友评论

          本文标题:isa 和superClass指针(2)

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