objc_object
id = objc_object [ isa、弱引用、關(guān)聯(lián)對象、內(nèi)存管理]
objc_class
class = objc_class [class superClass 、cache_t cache(方法緩存) 、class_data_bits_t bits]
isa 指針
64位
指針型 、非指針型
cache_t【用于快速查找方法執(zhí)行函數(shù)、是可增量擴(kuò)展的哈希表結(jié)構(gòu)、是局部性原理的最佳應(yīng)用】
class_data_bits_t
[對class_rw_t 封裝 、
class_rw_t 代表了相關(guān)讀寫信息、對class_to_t的封裝
class_to_t 類的相關(guān)只讀信息]
class_rw_t [
class_to_t
protocols 二維數(shù)組
properties 二維數(shù)組
methods 二維數(shù)組
]
class_to_t[
name (類名)
ivars (類的成員變量)
properties 一維數(shù)組
protocols 一維數(shù)組
methodList 一維數(shù)組
]
method_t
函數(shù)四要素 :
名稱、 sel name
返回值、 const char* types
參數(shù)、
函數(shù)體 imp
Type Encodings
const char* types(返回值、參數(shù)1、參數(shù)2….參數(shù)n)

對象、類對象 、元類對象
類對象 存儲實(shí)例方法列表等信息
元類對象 存儲類方法列表等信息
isa 指向根元類對象
消息傳遞
void objc_msgSend
void objc_msgSendSuper
緩存中查找是 哈希查找
當(dāng)前類方法中查找: 已排序好的 二分查找、未排序好的 一般遍歷查找
父類逐級查找

消息轉(zhuǎn)發(fā)機(jī)制
+(BOOL)resolveInstanceMethod:(SEL)sel {
//如果text方法 打印日志
if (sel == @selector(test)) {
NSLog(@"resolveInstanceMethod");
return NO;
}else {
//從父類的默認(rèn)調(diào)用
return [super resolveInstanceMethod:sel];
}
}
- (id)forwardingTargetForSelector:(SEL)aSelector {
NSLog(@"forwardingTargetForSelector");
return nil;
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
if (aSelector == @selector(test)) {
NSLog(@"methodSignatureForSelector:");
//v代表是void類型 @代表第一個(gè)參數(shù)類型是id ,即self
//:代表第二參數(shù)是SEL類型的 即@selector(test)
return [NSMethodSignature signatureWithObjCTypes:"v@:"];
}else {
return [super methodSignatureForSelector:aSelector];
}
}
- (void)forwardInvocation:(NSInvocation *)anInvocation {
NSLog(@"forwardInvocation:");
}