透明的數據結構,能夠理解爲C String數據結構
typedef struct objc_selector *SEL;函數
也就是說,SEL是指向一個C String的指針。spa
id/objc_object
指針
id - 指向一個類的實例對象
底層代碼定義code
typedef struct objc_object *id;對象
其中
objc_object的底層定義內存
struct objc_object { Class isa OBJC_ISA_AVAILABILITY; };
能夠看到,objc_object中,只是保存了一個Class類型的isa。這裏看不懂不要怕,先記着,對象中就是保存了一個指向Objective C中對應類的指針。
cmd
Class - 指向Objective C類對象(objc_class)的一個指針
底層定義io
typedef struct objc_class *Class;class
objc_class
底層定義
struct objc_class { Class isa OBJC_ISA_AVAILABILITY; #if !__OBJC2__ Class super_class OBJC2_UNAVAILABLE; const char *name OBJC2_UNAVAILABLE; long version OBJC2_UNAVAILABLE; long info OBJC2_UNAVAILABLE; long instance_size OBJC2_UNAVAILABLE; struct objc_ivar_list *ivars OBJC2_UNAVAILABLE; struct objc_method_list **methodLists OBJC2_UNAVAILABLE; struct objc_cache *cache OBJC2_UNAVAILABLE; struct objc_protocol_list *protocols OBJC2_UNAVAILABLE; #endif } OBJC2_UNAVAILABLE;/* Use `Class` instead of `struct objc_class *` */
能夠看到,這就是類對象結構體的定義,細心的同窗可能發現了類對象裏仍然有一個指針Class isa,先記着,這個isa指向的是類元對象。
IMP-指向實際執行函數體的函數指針
#if !OBJC_OLD_DISPATCH_PROTOTYPES typedef void (*IMP)(void /* id, SEL, ... */ ); #else typedef id (*IMP)(id, SEL, ...); #endif
能夠看到,這個函數體前兩個參數是 id(消息接受者,也就是對象),以及SEL(方法的名字)
method - 指向Objective C中的方法的指針
typedef struct objc_method *Method;11
其中
struct objc_method { SEL method_name OBJC2_UNAVAILABLE; char *method_types OBJC2_UNAVAILABLE; IMP method_imp OBJC2_UNAVAILABLE; }
SEL 類型的一個變量,Objective C的函數的前兩個隱藏參數爲self 和 _cmd
ivar - objective C中的實例變量
typedef struct objc_ivar *Ivar;
能夠看到變量的內存模型
struct objc_ivar { char *ivar_name OBJC2_UNAVAILABLE; char *ivar_type OBJC2_UNAVAILABLE; int ivar_offset OBJC2_UNAVAILABLE; #ifdef __LP64__ int space OBJC2_UNAVAILABLE; #endif }