1. Runtime是什么?
runtime是由C和C++匯編實現的一套API,為OC語言加入了面向對象,運行時的功能
運行時(Runtime)是指將數據類型的確定由編譯時推遲到了運行時
eg: extension - category 的區別
聯想到:運行時主要體現在平時的rw中
編譯時只讀取到了ro,但是其中真正的方法讀取主要體現在rw,
例如:編譯好的內存還可以往其中添加編譯和屬性,ro是無法修改的
平時編寫的OC代碼,在程序運行過程中,其實最終會轉換成Runtime的C語言代碼,Runtime是Object-C的幕后工作者
runtime的應用:
2.方法的本質,sel是什么?IMP是什么?兩者之間的關系又是什么?
?法的本質:發送消息,消息會有以下?個流程
1:快速查找(objc_msgSend)~cache_t緩存消息
2:慢速查找-遞歸??|?類~lookUpImpOrForward
3:查找不到消息:動態?法解析~resolveInstanceMethod
4:消息快速轉發~forwardingTargetForSelector
5:消息慢速轉發~methodSignatureForSelector&forwardInvocation
sel是?法編號~在read_images期間就編譯進?了內存
imp就是我們函數實現指針,找imp就是找函數的過程
sel就相當于書本的?錄tittle
imp就是書本的?碼
查找具體的函數就是想看這本書??具體篇章的內容
1:我們?先知道想看什么~tittle(sel)
2:根據?錄對應的?碼(imp)
3:翻到具體的內容
3.能否向編譯后的得到的類中增加實例變量?能否想運?時創建的類中添加實例變量
答案:
1:不能向編譯后的得到的類中增加實例變量
2:只要內沒有注冊到內存還是可以添加
原因:我們編譯好的實例變量存儲的位置在ro,?旦編譯完成,內存結構就完全確定就無法修改
可以添加屬性+?法
4.Asssociate?法關聯的對象
5.isKindOfClass和isMemberOfClass
isKindOfClass和isMemberOfClass主要看清楚查找的?向
6.[self class]和[super class]的區別以及原理分析
[self class]就是發送消息objc_msgSend,消息接受者是self?法編號:class
[super class]本質就是objc_msgSendSuper,消息的接受者還是self方法編號:class
只是objc_msgSendSuper會更快直接跳過self的查找
7.Runtime是如何實現weak的,為什么可以?動置nil
1.通過SideTable找到我們的weak_table
2.weak_table根據referent找到或者創建weak_entry_t
3.然后append_referrer(entry,referrer)將我的新弱引?的對象加進去entry
4.最后weak_entry_insert 把entry加?到我們的weak_table
8.黑魔法MethodSwizzling的坑與應?
1.交換類主動調用load
解決辦法:單例設計
2.交換沒有自己沒有實現,父類實現
解決辦法:
A.會先嘗試給自己添加要交換的方法
B.然后再將父類的IMP給swizzle
9.內存偏移面試
本文部分圖層轉載自Logic education Cooci