iOS - ISA

id是指向一个类的实例对象的指针。

/// A pointer to an instance of a class.
typedef struct objc_object *id;

类的底层定义

typedef struct objc_class *Class;

struct objc_class : objc_object {
    // Class ISA;
    Class superclass;
    cache_t cache;             // formerly cache pointer and vtable
    class_data_bits_t bits;    // class_rw_t * plus custom rr/alloc flags

    class_rw_t *data() const {
        return bits.data();
    }
    //……
}

对象的底层定义,类继承自objc_object,所以类也是对象,类对象。
ISA() assumes this is NOT a tagged pointer object假设这不是tagged pointer object,因为TaggedPointer没有isa指针

struct objc_object {
private:
    isa_t isa;

public:
    // ISA() assumes this is NOT a tagged pointer object
    Class ISA();

    // rawISA() assumes this is NOT a tagged pointer object or a non pointer ISA
    Class rawISA();

    // getIsa() allows this to be a tagged pointer object
    Class getIsa();

    //……
}

OC对象的本质,每个OC对象都含有一个isa指针,64位之前,isa仅仅是一个指针,保存着对象或类对象内存地址,在64位架构之后,apple对isa进行了优化,叫做nonpointer_isa,变成了一个共用体(union)结构,同时使用位域来存储更多的信息。

union isa_t {
    isa_t() { }
    isa_t(uintptr_t value) : bits(value) { }

    Class cls;
    uintptr_t bits;
#if defined(ISA_BITFIELD)
    struct {
        //ISA_BITFIELD;  // defined in isa.h
# if __arm64__
        //表示是否对isa开启指针优化 。0代表是纯isa指针,1代表除了地址外,还包含了类的一些信息、对象的引用计数等。
        uintptr_t nonpointer        : 1;                                       \
        //是否有关联对象
        uintptr_t has_assoc         : 1;                                       \
        //是否有C++或Objc的析构器,如果有析构函数,则需要做一些析构的逻辑处理,如果没有,则可以更快的释放对象
        uintptr_t has_cxx_dtor      : 1;                                       \
        //存储类指针的值,开启指针优化的情况下,arm64位中有33位来存储类的指针。
        uintptr_t shiftcls          : 33; /*MACH_VM_MAX_ADDRESS 0x1000000000*/ \
        //判断当前对象是真的对象还是一段没有初始化的空间
        uintptr_t magic             : 6;                                       \
        //是否有被弱引用,没有弱引用的对象释放的更快
        uintptr_t weakly_referenced : 1;                                       \
        //是否正在释放
        uintptr_t deallocating      : 1;                                       \
        //是否有使用SideTable进行引用计数
        uintptr_t has_sidetable_rc  : 1;                                       \
        //表示该对象的引用计数值,实际上是引用计数减一。
        uintptr_t extra_rc          : 19
# elif __x86_64__
        uintptr_t nonpointer        : 1;                                         \
        uintptr_t has_assoc         : 1;                                         \
        uintptr_t has_cxx_dtor      : 1;                                         \
        uintptr_t shiftcls          : 44; /*MACH_VM_MAX_ADDRESS 0x7fffffe00000*/ \
        uintptr_t magic             : 6;                                         \
        uintptr_t weakly_referenced : 1;                                         \
        uintptr_t deallocating      : 1;                                         \
        uintptr_t has_sidetable_rc  : 1;                                         \
        uintptr_t extra_rc          : 8
# endif

    };
#endif
};
ISA指向结构图

你可能感兴趣的:(iOS - ISA)