問題:緩存
- 對象的isa指針指向哪裏
- 實例對象的isa指向類對象
- 類對象的isa指向元類對象
- 元類對象的isa指向基類的元類對象
- oc對象的信息存儲在哪裏?
- 對象方法、屬性、成員變量、協議存儲在class對象中
- 類方法存儲在元類對象中
- 成員變量的值存儲在實例對象中
- isa指針
- 其餘成員變量
- isa指針
- superclass指針
- 類的屬性信息(@property)、類的對象方法信息(instance > * method)
- 類的協議信息(protocol)、類的成員變量信息(ivar)
- 其餘成員變量
object_getclass
可獲取到元類對象
- isa指針
- superclass指針
- 類的屬性信息(@property)、類的對象方法信息(instance > * method)
- 類的協議信息(protocol)、類的成員變量信息(ivar)
- 其餘成員變量
從底層來看,class和meta-class都是objc_class結構markdown
struct objc_class {
Class ISA;
Class superclass;
cache_t cache; // 方法緩存
class_data_bits_t bits; // 類的具體信息,想要&FAST_DATA_MASK才能獲取到正確的地址
...
};
複製代碼
class_data_bits_t結構大致:ui
struct class_data_bits_t {
class_rw_t* data; //存儲類的信息
...
}
複製代碼
class_rw_t大致結構:atom
struct class_rw_t {
uint32_t flags;
uint16_t witness;
explicit_atomic<uintptr_t> ro_or_rw_ext;
Class firstSubclass;
Class nextSiblingClass;
using ro_or_rw_ext_t = objc::PointerUnion<const class_ro_t *, class_rw_ext_t *>;
const ro_or_rw_ext_t get_ro_or_rwe();
const class_ro_t *ro();
const method_array_t methods(); //方法列表
const property_array_t properties(); //屬性列表
const protocol_array_t protocols(); //協議列表
...
};
複製代碼
其中ro結構體爲:spa
struct class_ro_t {
uint32_t flags;
uint32_t instanceStart;
uint32_t instanceSize; //實例建立出來的佔用的空間大小
#ifdef __LP64__
uint32_t reserved;
#endif
const uint8_t * ivarLayout;
const char * name; //類名
method_list_t * baseMethodList;
protocol_list_t * baseProtocols;
const ivar_list_t * ivars;
const uint8_t * weakIvarLayout;
property_list_t *baseProperties;
...
};
複製代碼
小細節:define ISA_MASK 0x0000000ffffffff8ULL
能夠發現isa指向的類或者元類對象的地址,最後三位都是0。3d