面試題的答案都是拋磚引玉,具體細節還得深刻了解iOS底層原理
複製代碼
一、簡述一下 OC 的消息機制?
- OC中的方法調用其實都是轉成了objc_msgSend函數的調用,給receiver(方法調用者)發送了一條消息(selector方法名)
- objc_msgSend底層有3大階段: 消息發送(當前類、父類中查找)、動態方法解析、消息轉發。
1.一、消息發送
注:
- 若是是從class_rw_t中查找方法 √ 已經排序的,二分查找 √ 沒有排序的,遍歷查找
- receiver經過isa指針找到receiverClass
- receiverClass經過superclass指針找到superClass
1.二、動態方法解析
1.三、消息轉發
二、super的本質是怎樣的?
- super調用,底層會轉換爲objc_msgSendSuper2函數的調用,接收2個參數 √ struct objc_super2 √ SEL
- receiver是消息接收者
- current_class是receiver的Class對象
三、什麼是Runtime?項目中有用過麼?
- OC是一門動態性比較強的編程語言,容許不少操做推遲到程序運行時再進行
- OC的動態性就是由Runtime來支撐和實現的,Runtime是一套C語言的API,封裝了不少動態性相關的函數
- 平時編寫的OC代碼,底層都是轉換成了Runtime API進行調用
- 具體應用 √ 利用關聯對象(AssociatedObject)給分類添加屬性 √ 遍歷類的全部成員變量(修改textfield的佔位文字顏色、字典轉模型、自動歸檔解檔) √ 交換方法實現(交換系統的方法) √ 利用消息轉發機制解決方法找不到的異常問題
四、什麼是isa?
- 在arm64架構以前,isa就是一個普通的指針,存儲着Class、Meta-Class對象的內存地址
- 從arm64架構開始,對isa進行了優化,變成了一個共用體(union)結構,還使用位域來存儲更多的信息
簡單說明共同體成員的字段含義: 面試