iOS底層面試題--Runtime

weixin_34208185發表於2018-11-25

面試題的答案都是拋磚引玉,具體細節還得深入瞭解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)結構,還使用位域來儲存更多的資訊

簡單說明共同體成員的欄位含義:

相關文章