NSObject
@interface NSObject <NSObject> {
Class isa;
}
其中Class是一個(gè)結(jié)構(gòu)(struct)指針
typedef struct objc_class *Class;
其中objc_class結(jié)構(gòu)如下
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;
怎么又有一個(gè)isa?疗韵?這些isa到底是什么?之間有什么區(qū)別和聯(lián)系
objc_class中也有一個(gè)isa對象,這是因?yàn)橐粋€(gè) ObjC 類本身同時(shí)也是一個(gè)對象帽馋,為了處理類和對象的關(guān)系,runtime 庫創(chuàng)建了一種叫做元類 (Meta Class) 的東西比吭,類對象所屬類型就叫做元類,而這個(gè)元類同時(shí)也是一個(gè)根元類 (root meta class) 的實(shí)例绽族。所有的元類最終都指向根元類為其超類
objc_ivar_list結(jié)構(gòu)體存儲著objc_ivar數(shù)組列表,而objc_ivar結(jié)構(gòu)體存儲了類的單個(gè)成員變量的信息衩藤;同理objc_method_list結(jié)構(gòu)體存儲著objc_method數(shù)組列表吧慢,而objc_method結(jié)構(gòu)體存儲了類的某個(gè)方法的信息。
Cache為方法調(diào)用的性能進(jìn)行優(yōu)化赏表,通俗地講检诗,每當(dāng)實(shí)例對象接收到一個(gè)消息時(shí),它不會直接在isa指向的類的方法列表中遍歷查找能夠響應(yīng)消息的方法瓢剿,因?yàn)檫@樣效率太低了逢慌,而是優(yōu)先在Cache中查找。Runtime 系統(tǒng)會把被調(diào)用的方法存到Cache中(理論上講一個(gè)方法如果被調(diào)用间狂,那么它有可能今后還會被調(diào)用)攻泼,下次查找的時(shí)候效率更高。
Ivar是一種代表類中實(shí)例變量的類型
typedef struct objc_ivar *Ivar;
結(jié)構(gòu)如下
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
}