在objc4-781 的源碼中
在最新的iOS 64架構(gòu)中
isa 指針有64個字節(jié)犀被,為共用體
nonpointer 是不是非指針類型的绕沈,若是指針類型的里面放的值就是指向類對象或者元類,或者根元類的地址,
has_assoc 有沒有關(guān)聯(lián)對象相關(guān)的
has_cxx_dtor 有沒有C++或者是MRC相關(guān)的
shiftcls 非指針類型的這部分存的就是 類對象或者元類闻葵,或者根元類的地址晃虫,
magic 調(diào)試器相關(guān)的
weakly_referenced 有沒有弱應(yīng)用相關(guān)的
deallocating 標識有沒有正在釋放
has_sidetable_rc 引用有沒有引用計數(shù)標
extra_rc 存的是引用計數(shù)器荠商,操作原理是:先優(yōu)先操作這里面的引用計數(shù)寂恬,再操作引用計數(shù)表中的,若為0 會把引用表中的放在這里面莱没,若滿了會放在表中初肉,但每次都會保留1半。
知識點:
即實例對象通過isa指針找類對象時 - isa指針需& 上ISA_MASK 才能找到真實的地址饰躲。
類的結(jié)構(gòu)關(guān)系
@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++中結(jié)構(gòu)體是可以繼承的 )
isa_t 共用體
上面說了isa superclass 那現(xiàn)在說 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拼卵,是二維數(shù)組奢浑,里面放的就是分類中的協(xié)議、 屬性腋腮、方法雀彼,每1個分類就是1個數(shù)組,先編譯的分類就先放在二維數(shù)組的前面即寡。
那還有呢-若分類中的關(guān)聯(lián)對象在哪能徊哑,你這不對吧。??
class_ro_t 那就是類的本體了聪富,類名莺丑,方法列表,屬性墩蔓、成員變量梢莽、協(xié)議列表,都是1維的了奸披。
知識點總結(jié)到1張圖
有了這張圖那 iOS中類的關(guān)系就明確了昏名。
有什么不對的地方歡迎斧正。