YYModel 原始碼歷險記:關於ivar,method,property

發表於2016-05-30

1. 預備知識

在看原始碼之前我們先看一下objc中對於ivar,method,property的原始碼,由於網上現在很多關於runtime還在用objc2.0之前的原始碼,本來也打算這麼做,但是本著匠心精神,做事要嚴謹,還是把新的程式碼給翻出來了

1.1 ivar

ivar關鍵的屬性有3個跟今天要講的有關係的屬性是name,type,offset,分別對應ivar的名字,型別和偏移量,偏移量這個說來話長,想仔細深入的推薦看《程式設計師的自我修養》,你會在裡面的到一個滿意的解答

1.2 property

每一個property中都有一個name代表著屬性名,attributes就是上一節我們說到的關於一個屬性的宣告描述,如屬性的原子性、記憶體管理規則等描述都存放在這裡

1.3 Method

關於method要說的東西比較多,我們先看一下method的原始碼

在這裡我們需要了解SEL和IMP分別是什麼:
在執行的時候,runtime會為每一個class準備一張virtual table表,表格裡以字串當key,每個key會對應到C function的指標位置。在runtime裡,將C function 定義為IMP,將key的C字串定義為SEL,叫做selector type:

YYModel 原始碼歷險記:關於ivar,method,property
SEL與IMP

SEL: 方法ID

IMP:函式指標 C function Point

瞭解了SEL和IMP之後我們再來看method的定義,不難看出method中有方法名的字串和方法的訪問地址,順便儲存了方法的型別,當然還要有返回型別和引數型別,這樣就構成了一個method。
既然預備工作已經做好了,我們就來看YYModel的對這三項的封裝

2. YYClassIvarInfo

這裡為什麼要對這個ivar的記憶體偏移地址和型別等這些,這裡這樣做是為了後面處理起來的時候,可以直接在外面暴露的地方獲取到這些屬性,而不需要再用runtime獲取對應的內容,也可以增加記憶體的命中率。(目前來說讀原始碼到這裡的理解是這樣,後面讀著如果有其他理解我會進行修改)

3 YYClassMethodInfo

3. YYClassPropertyInfo

4. 最後

有人說每次篇幅比較少而且講的比較淺,那肯定是啊,都是從基礎的地方開始分析,才能往上擴充,本來這次的目的就是寫一篇小白讀原始碼的,但後面的內容也會多分析一下深層的,謝謝支援

相關文章