一、id(objc_object,isa
id=objc_object(isa_t,isa操作相關(guān),弱引用相關(guān),關(guān)聯(lián)對象相關(guān),內(nèi)存管理相關(guān))
Class=obj_class(繼承objc_object,Class superClass, cache_t cache,class_data_bits bits(變量、屬性
方法))

isa為共用體isa_t 64位的0或者1,指針型的isa值為Class的地址,非指針型的部分值代表Class地址
實(shí)例方法存在類對象中,靜態(tài)方法存在元類對象中
cache_t 用于快速查找執(zhí)行函數(shù),是可增量擴(kuò)展的哈希表結(jié)構(gòu),是局部性原理的最佳應(yīng)用。可以理解為數(shù)組組成,里面存儲這bucket_t(key,IMP)
class_data_bits_t主要是對class_rw_t的封裝,class_rw_t代表了類對相關(guān)讀寫信息、class_ro_t的封裝,class_ro_t代表了類相關(guān)的制度信息
class_rw_t(class_ro_t,protocls(二維數(shù)組),properies(二維數(shù)組),methods(二維數(shù)組)),分類中的方法、屬性、協(xié)議會存在其中
class_ro_t(name,ivars,properties,protocols,methodList),一維數(shù)組,存儲的原始定義中存儲的方法、屬性、協(xié)議的廣告內(nèi)容
method_t(函數(shù)的四要素,SEL name名稱、const char * types(返回值、參數(shù))、IMP imp 函數(shù)體)
Type Encodings技術(shù) 返回值|參數(shù)1|參數(shù)2|...參數(shù)n,例如v@: v表示void,@表示id,:表示SEL,可參考官方文檔
二、對象、類對象、元類對象

類對象存儲實(shí)例方法列表等信息,元類對象存儲類方法列表等信息
void objc_msgSend(id,SEl),void objc_msgSendSuper(id,SEl)
NSLog(@"[self class] %@",[self class]);
NSLog(@"[self class] %@",[super class]);
打印的都是當(dāng)前類
方法查找
緩存查找:給定SEL通過哈希查找f(key)=key&mask找到到目標(biāo)對應(yīng)bucket_t中的IMP函數(shù)指針
當(dāng)前類中查找:已排序好的方法列表采用二分查找,沒有排序好的采用遍歷查找對應(yīng)的執(zhí)行函數(shù)
父類逐級查找:緩存-》方法列表-》有父類去父類-》沒有父類結(jié)束查找
消息轉(zhuǎn)發(fā)
- (BOOL)resolveInstanceMethod:(SEL)sel -》- (id)forwardingTargetForSelector:(SEL)aSelector -》-(NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector -》- (void)forwardInvocation:(NSInvocation *)anInvocation
Method Swizzling (方法交換)
Method testMethod = class_getInstanceMethod(self, @selector(test));
Method otherTextmethod = class_getInstanceMethod(self, @selector(otherTest));
method_exchangeImplementations(testMethod, otherTextmethod);
可以用來攔截方法再調(diào)用原來的方法實(shí)現(xiàn)數(shù)據(jù)統(tǒng)計(jì)等
動態(tài)添加方法
class_addMethod(self, @selector(test), add_test, "v@:");
動態(tài)方法解析
@dynamic
動態(tài)語言將函數(shù)決議推遲到運(yùn)行時(shí)
編譯時(shí)語言在編譯期進(jìn)行函數(shù)決議
編譯后的類不能增加實(shí)例變量,能向運(yùn)行時(shí)創(chuàng)建的類中添加實(shí)例變量,但是得在調(diào)用 objc_allocateClassPair 之后,objc_registerClassPair 之前