类与对象的关系
这张图想必大家不会陌生,它展示了对象、类、元类之间的关系

- 对象(Instance)的isa指针指向类(Class)
- 类(Class)的isa指针指向元类(Meta Class)
对象
对象在objc.h中的数据结构为objc_object
- 它仅包含一个指向类(Class)的isa指针
- objc_object *即为id类型,可以指向任何OC对象
typedef struct objc_class *Class;
typedef struct objc_object *id;
/// Represents an instance of a class.
struct objc_object {
Class _Nonnull isa OBJC_ISA_AVAILABILITY;
};
而objc_object在objc-private.h中的定义,isa的数据结构换成了isa_t
struct objc_object {
private:
isa_t isa;
...
}
isa_t是一个共用体(所有成员占用同一段内存,修改其中一个会影响其他成员)
union isa_t {
isa_t() { }
isa_t(uintptr_t value) : bits(value) { }
Class cls;
uintptr_t bits; // typedef unsigned long uintptr_t;
#if defined(ISA_BITFIELD)
struct {
// isa 结构的定义
ISA_BITFIELD; // defined in isa.h
};
#endif
};
在arm64架构下,ISA_BITFIELD定义如下
# define ISA_BITFIELD \
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
从bits和ISA_BITFIELD的定义不难看出,isa_t占用64位,仅使用shiftcls所占用的33位来储存Class、Meta-Class对象的内存地址信息
类
类在runtime.h中的定义为objc_class
- 它也包含一个指向类(这里实际会指向元类)的isa指针
- 另外还包含了一些数据结构来储存变量、方法等
struct objc_class {
Class _Nonnull isa OBJC_ISA_AVAILABILITY;
#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;
而在objc_class的私有定义(objc-runtime-new.h)中可以看到更多的信息
- 它继承自objc_object,所以也是对象
- OC中的Class类型即为objc_class *类型
- 变量、方法等信息都储存在class_data_bits_t结构中
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
...
};
网友评论