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