OC底層那些事

1. Runtime是什么?

runtime是由C和C++匯編實現的一套API,為OC語言加入了面向對象,運行時的功能

運行時(Runtime)是指將數據類型的確定由編譯時推遲到了運行時
eg: extension - category 的區別
聯想到:運行時主要體現在平時的rw中

編譯時只讀取到了ro,但是其中真正的方法讀取主要體現在rw,
例如:編譯好的內存還可以往其中添加編譯和屬性,ro是無法修改的

平時編寫的OC代碼,在程序運行過程中,其實最終會轉換成Runtime的C語言代碼,Runtime是Object-C的幕后工作者

runtime的應用:


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?法關聯的對象

Asssociate?法關聯的對象

5.isKindOfClass和isMemberOfClass

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。