在objc4-781 的源码中
在最新的iOS 64架构中
isa 指针有64个字节,为共用体
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 <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
所以 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的封装
说明下class_rw_t 中的 protocols properties methods,是二维数组,里面放的就是分类中的协议、 属性、方法,每1个分类就是1个数组,先编译的分类就先放在二维数组的前面。
那还有呢-若分类中的关联对象在哪能,你这不对吧。😝
class_ro_t 那就是类的本体了,类名,方法列表,属性、成员变量、协议列表,都是1维的了。
知识点总结到1张图
有了这张图那 iOS中类的关系就明确了。
有什么不对的地方欢迎斧正。