isa 和superClass指针(2)

在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  {
#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))