實例對象是咱們對類對象alloc或者new操做時所建立的,在這個過程當中會拷貝實例所屬類的成員變量,但並不拷貝類定義的方法。緩存
/// Represents an instance of a class.
struct objc_object {
Class _Nonnull isa OBJC_ISA_AVAILABILITY;
};
/// A pointer to an instance of a class.
typedef struct objc_object *id;
複製代碼
objc_object這個結構體只有一個isa變量,指向實例對象所屬的類。任何帶有以指針開始並指向類結構的結構均可以被視做objc_object, 對象最重要的特色是能夠給其發送消息。bash
typedef struct objc_class *Class;
複製代碼
因而可知 ,Class是指向C的結構體objc_class的指針,咱們再看一下objc_class的定義函數
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
複製代碼
是一個Class 類型的指針,每一個實例對象有個isa的指針,他指向對象的類,而Class裏也有個isa的指針, 指向meteClass(元類)spa
因而可知,在給實例對象或類對象發送消息時,尋找方法列表的規則爲:指針
全部元類都有一個根元類,好比全部NSObject的子類的元類都會以NSObject的元類做爲他們的類。全部的元類使用根元類做爲他們的類,根元類的元類則就是它本身,也就是說根元類的isa指針指向他本身。code
object_getClass(實例對象) == [實例對象 class]
[類對象 class] == 類對象
object_getClass(類對象) == 類對象的isa == 元類
object_getClass(類對象) != [類對象 class]
複製代碼