面試題的答案都是拋磚引玉,具體細節還得深入瞭解iOS底層原理
複製程式碼
1、簡述一下 OC 的訊息機制?
- OC中的方法呼叫其實都是轉成了objc_msgSend函式的呼叫,給receiver(方法呼叫者)傳送了一條訊息(selector方法名)
- objc_msgSend底層有3大階段: 訊息傳送(當前類、父類中查詢)、動態方法解析、訊息轉發。
1.1、訊息傳送
注:- 如果是從class_rw_t中查詢方法 √ 已經排序的,二分查詢 √ 沒有排序的,遍歷查詢
- receiver通過isa指標找到receiverClass
- receiverClass通過superclass指標找到superClass
1.2、動態方法解析
1.3、訊息轉發
2、super的本質是怎樣的?
- super呼叫,底層會轉換為objc_msgSendSuper2函式的呼叫,接收2個引數 √ struct objc_super2 √ SEL
- receiver是訊息接收者
- current_class是receiver的Class物件
3、什麼是Runtime?專案中有用過麼?
- OC是一門動態性比較強的程式語言,允許很多操作推遲到程式執行時再進行
- OC的動態性就是由Runtime來支撐和實現的,Runtime是一套C語言的API,封裝了很多動態性相關的函式
- 平時編寫的OC程式碼,底層都是轉換成了Runtime API進行呼叫
- 具體應用 √ 利用關聯物件(AssociatedObject)給分類新增屬性 √ 遍歷類的所有成員變數(修改textfield的佔位文字顏色、字典轉模型、自動歸檔解檔) √ 交換方法實現(交換系統的方法) √ 利用訊息轉發機制解決方法找不到的異常問題
4、什麼是isa?
- 在arm64架構之前,isa就是一個普通的指標,儲存著Class、Meta-Class物件的記憶體地址
- 從arm64架構開始,對isa進行了優化,變成了一個共用體(union)結構,還使用位域來儲存更多的資訊
簡單說明共同體成員的欄位含義: