每一個(gè)NSObject都有一個(gè)指針isa
@interface NSObject <nsobject> {
Class isa OBJC_ISA_AVAILABILITY;
}</nsobject>
而指針的結(jié)構(gòu)是:
typedef struct objc_class *Class;
struct objc_class {
Class isa; // 指向metaclass
Class super_class ; // 指向其父類
const char *name ; // 類名
long version ; // 類的版本信息背犯,初始化默認(rèn)為0凡恍,可以通過runtime函數(shù)class_setVersion和class_getVersion進(jìn)行修改、讀取
long info; // 一些標(biāo)識(shí)信息,如CLS_CLASS (0x1L) 表示該類為普通 class 房待,其中包含對(duì)象方法和成員變量;CLS_META (0x2L) 表示該類為 metaclass邢羔,其中包含類方法;
long instance_size ; // 該類的實(shí)例變量大小(包括從父類繼承下來的實(shí)例變量);
struct objc_ivar_list *ivars; // 用于存儲(chǔ)每個(gè)成員變量的地址
struct objc_method_list **methodLists ; // 與 info 的一些標(biāo)志位有關(guān),如CLS_CLASS (0x1L),則存儲(chǔ)對(duì)象方法,如CLS_META (0x2L)桑孩,則存儲(chǔ)類方法;
struct objc_cache *cache; // 指向最近使用的方法的指針拜鹤,用于提升效率;
struct objc_protocol_list *protocols; // 存儲(chǔ)該類遵守的協(xié)議
}
- isa: 指向metaclass流椒,也就是靜態(tài)的Class敏簿。
一般一個(gè)實(shí)例Obj對(duì)象中的isa會(huì)指向普通的Class,這個(gè)Class中存儲(chǔ)普通成員變量和對(duì) 象方法(“-”開頭的方法);
普通Class中的isa指針指向靜態(tài)Class惯裕,靜態(tài)Class中存儲(chǔ)static類型成員變量和類方法(“+”開頭的方法)温数。
isa 指針的指向圖
如圖所示 所有metaclass中isa指針都指向根metaclass。而根metaclass則指向自身蜻势。
super_class:指向父類撑刺,如果這個(gè)類是根類,則為NULL握玛。
objc_method_list:方法列表
struct objc_method_list {
struct objc_method_list *obsolete;
int method_count;
#ifdef __LP64__
int space;
#endif
/* variable length structure */
struct objc_method method_list[1];
};
在 _ struct objc_method method_list[1] 里面存儲(chǔ)的是 objc_method _元素:
struct objc_method {
SEL method_name;
char *method_types; /* a string representing argument/return types */
IMP method_imp;
};
具體請(qǐng)看大神:
http://blog.csdn.net/a19860903/article/details/44853841
http://yulingtianxia.com/blog/2014/11/05/objective-c-runtime/
http://southpeak.github.io/blog/2014/10/25/objective-c-runtime-yun-xing-shi-zhi-lei-yu-dui-xiang/