最近在深入的去理解oc的runtime機制,我覺得它就像是和C的一個橋梁藕畔。為什么這么說呢马僻?大家都知道高級編程語言都需要編譯為匯編語言在編譯為機器語言變?yōu)榭蓤?zhí)行文件,但是OC并不能直接編譯為匯編語言注服,需要先轉換為C韭邓。而OC到C的過渡措近,依賴的就是runtime。所以runtime的重要性就不言而喻了女淑。
OC的對象和類 —> C結構體
在剛接觸OC時瞭郑,有這些詞基本隨時都要打交道:
-類
-父類
-元類
-對象
-類對象
-實例對象
接下來將會讓你完全理解這些名詞之前的關系,我們通過<objc/Objc.h>可以發(fā)現(xiàn)有這些代碼
#if !OBJC_TYPES_DEFINED
/// An opaque type that represents an Objective-C class.
///不透明的類型鸭你,表示Objective-C類屈张。
typedef struct objc_class *Class;
/// 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;
#endif
不難看出阁谆,類對象Class就是struct objc_class結構體,所謂的實例對象愉老,其實就是一個struct objc_object結構體笛厦,其中的isa就是指向類對象的指針,id就是指向這個結構體的指針俺夕。
在深入看一下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
} OBJC2_UNAVAILABLE;
/* Use `Class` instead of `struct objc_class *` */
其中包括了一個Class類型的super_class,也就是父類裳凸,以及名字、版本劝贸、信息姨谷、大小、方法列表映九、緩存等等梦湘。這也就是我們平時用到的類的這些信息了。并且這個結構體存放的數(shù)據(jù)我們稱為元數(shù)據(jù)(metadata)件甥,那么顯然這個isa指針指向的就是元類的Class捌议。
至此這些名詞已經(jīng)全部解釋清楚,整理一下可以得到這樣一個圖
到這里基本也就清楚了OC里面類和對象這些關系了引有。