iOS Runtime

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)


WechatIMG28.jpeg

對象、類對象 、元類對象
類對象 存儲實(shí)例方法列表等信息
元類對象 存儲類方法列表等信息

isa 指向根元類對象

消息傳遞

void objc_msgSend
void objc_msgSendSuper
緩存中查找是 哈希查找
當(dāng)前類方法中查找: 已排序好的 二分查找、未排序好的 一般遍歷查找
父類逐級查找


WechatIMG29.jpeg

消息轉(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:");
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容