YYModel 原始碼歷險記 對Class的封裝

發表於2016-05-30

1. 預備知識

YYModel 原始碼歷險記 對Class的封裝
NSObject

首先每一個instance即例項物件都有一根指標叫isa_t指標,指向物件對應的class,每一個class都有一個對應的isa_t指標指向class對應的元類。為什麼要搞出元類這個東西呢? 關於這個問題我們自己不難理解,我們可以想一下我們每次呼叫一個類的例項方法和類方法,這些方法都分別儲存在哪個地方呢?是不是例項方法就儲存在例項中,類方法就儲存在類中呢?

其實我們只要仔細想一下就發現這種方式是行不通的,每一個例項中的例項方法都試一樣的,如果每一個例項都要儲存一次方法,那豈不是造成了相當多的資源浪費? 於是就有了這麼一個東西,下一層的方法儲存在上一層中,我們只要把例項方法儲存在class中,類方法儲存在類的元類中,這樣每次要找對應的方法,直接去找對應的上一級,這樣更加高效而且更加節省資源。關於詳細的資料請參考參考資料

2. YYClassInfo

YYClassInfo是對Class的一個封裝,將class一些常用的資訊進行了快取,提高了命中率和訪問效率,我們先看原始碼來理解

在YYClassInfo宣告的方法裡,我們可以看到YYClassInfo一旦class進行了修改,就要做對應的更新,這樣的操作是為了能夠高效快取class的資訊,如ivars,method,property,我們首先從這個類的入口方法開始看起

2.1 入口

這裡有幾點需要說明一下:

  1. mutable不是執行緒安全的,所以這裡需要建立鎖
  2. 建立快取容器,如果在快取容器中直接找到了class,則直接獲取到對應的ivar,method,property,這樣在下次訪問到的時候就不用再去找
  3. 如果沒有獲取到,就開始建立一個YYClassInfo獲得class中的描述資訊

2.2 建立YYClassInfo

這裡呼叫到了_update更新資訊的介面

2.3 更新

YYClassInfo維護了一個變數來判斷是否需要重新整理,通過呼叫setNeedUpdate來修改_needUpdate=YES,進而呼叫_update方法來進行重新整理

3. 小結

說到這裡關於YYClassInfo的程式碼已經分析完了,在這個類中,YY對於Ivar,property和Method都進行了一層封裝,最後都服務於YYClassInfo,這樣做的一個好處就是把原來裡層的內容暴露在外層,方便查詢,也可以進行快取,提高訪問效率和命中率,這也是對後面進行json轉換做的一些工作

4.最後

接下來會對核心類NSObject+YYModel進行研讀,一路讀下來發現寫程式碼就該像YYModel這樣有規範,有匠心精神。最近想研究一下快取的機制,希望能好好讀一下YYCache從中學習。

相關文章