Runtime

一、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(變量、屬性

方法))

WX20191105-083159@2x.png

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,可參考官方文檔

二、對象、類對象、元類對象

WX20191105-083215@2x.png

類對象存儲實(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 之前

?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 我們常常會聽說 Objective-C 是一門動態(tài)語言,那么這個「動態(tài)」表現(xiàn)在哪呢?我想最主要的表現(xiàn)就是 Obje...
    Ethan_Struggle閱讀 2,345評論 0 7
  • 本文轉(zhuǎn)載自:http://yulingtianxia.com/blog/2014/11/05/objective-...
    ant_flex閱讀 888評論 0 1
  • 本文詳細(xì)整理了 Cocoa 的 Runtime 系統(tǒng)的知識,它使得 Objective-C 如虎添翼,具備了靈活的...
    lylaut閱讀 867評論 0 4
  • 文中的實(shí)驗(yàn)代碼我放在了這個項(xiàng)目中。 以下內(nèi)容是我通過整理[這篇博客] (http://yulingtianxia....
    茗涙閱讀 1,028評論 0 6
  • 本文轉(zhuǎn)載自:http://southpeak.github.io/2014/10/25/objective-c-r...
    idiot_lin閱讀 1,032評論 0 4

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