isa详解

作者: YY_Lee | 来源:发表于2019-02-15 16:53 被阅读0次

    arm64架构之前,isa就是一个普通的指针,存储着Class或Meta-Class对象的内存地址。arm64架构之后对isa做了优化,isa变成了共用体(union)结构,还使用了位域来存储更多的信息。

    下面是runtime源码中对arm64架构的isa的定义

    union isa_t 
    {
        Class cls;
        uintptr_t bits;
        struct {
            uintptr_t nonpointer        : 1;
            uintptr_t has_assoc         : 1;
            uintptr_t has_cxx_dtor      : 1;
            uintptr_t shiftcls          : 33; // MACH_VM_MAX_ADDRESS 0x1000000000
            uintptr_t magic             : 6;
            uintptr_t weakly_referenced : 1;
            uintptr_t deallocating      : 1;
            uintptr_t has_sidetable_rc  : 1;
            uintptr_t extra_rc          : 19;
        };
    };
    
    • nonpointer
      0,代表普通的指针,存储Class或Meta-Class对象的内存地址
      1,代表是优化过后的共用体

    • has_assoc
      是否设置过关联对象,如果没有,释放时会更快。

    • has_cxx_dtor
      是否有C++的析构函数,如果没有,释放时会更快。

    • shiftcls
      存储Class或Meta-Class对象的内存地址

    • magic
      用于调试时分辨对象是否完成初始化

    • weakly_referenced
      是否有被弱引用指向过,如果没有,释放时会更快。

    • deallocating
      对象是否正在释放;

    • has_sidetable_rc
      引用计数器是否过大无法存储在isa中。如果为1,那么引用计数会存储在一个叫SideTable的类的属性中;

    • extra_rc
      里面存储的值是引用计数器减1

    下面是runtime源码中释放对象时调用的函数

    void *objc_destructInstance(id obj) 
    {
        if (obj) {
            // Read all of the flags at once for performance.
            bool cxx = obj->hasCxxDtor();
            bool assoc = !UseGC && obj->hasAssociatedObjects();
            bool dealloc = !UseGC;
    
            // This order is important.
            if (cxx) object_cxxDestruct(obj);
            if (assoc) _object_remove_assocations(obj);
            if (dealloc) obj->clearDeallocating();
        }
    
        return obj;
    }
    

    从源码中可以看出,当有C++的析构函数、有关联过对象时,需要先调用C++的析构函数,移除关联对象。

    相关文章

      网友评论

        本文标题:isa详解

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