YYModel
簡(jiǎn)單一看 YY 的代碼規(guī)模就是和其他庫沒有辦法相比的, 只有兩個(gè)文件
其中把一個(gè)類的信息拆分為下面這幾種類
- YYClassInfo
- YYClassIvarInfo
- YYClassMethodInfo
- YYClassPropertyInfo
還有兩個(gè)私有的類, 用來解析用戶設(shè)定的自定義模型, 通過這兩個(gè)類的分析, 來快速的得知如何去進(jìn)行轉(zhuǎn)化
- _YYModelPropertyMeta
- _YYModelMeta
簡(jiǎn)單說一下解析流程
1 獲取要解析為的對(duì)象的 CLASS, 并生成實(shí)例
2 調(diào)用這個(gè)對(duì)象的 yy_modelSetWithDictionary 方法
2.1 這個(gè)方法會(huì)在轉(zhuǎn)化前后判斷是否需要執(zhí)行 modelCustomWillTransformFromDictionary 和 modelCustomTransformFromDictionary 方法
2.2 使用 CFDictionaryApplyFunction 等一系列 CF 賦值
轉(zhuǎn)化回來的流程是這樣的
1 所有的方法最后都會(huì)調(diào)用到一個(gè) ModelToJSONObjectRecursive 的函數(shù)上
1.1 這個(gè)函數(shù)做的事情基本就是判斷類型 然后遞歸轉(zhuǎn)化, 最后傳出來一個(gè)只有基本類型的對(duì)象
1.2 其中如果是自定義的類 那么仍然需要 獲取 _YYModelMeta 然后進(jìn)行轉(zhuǎn)化
1.3 如果用戶提供了 modelCustomTransformToDictionary 方法, 那么根據(jù)用戶自己的方法來再進(jìn)行一次額外的轉(zhuǎn)化
2 轉(zhuǎn)化完之后再根據(jù)各自不同的需求轉(zhuǎn)化為相應(yīng)的類型
復(fù)制, equal, hash 等的判斷邏輯
- hash 是獲取 _YYModelMeta 和 每一個(gè) _YYModelPropertyMeta 然后 ^= 每一個(gè)屬性的 hash 值
- equal 的的判斷優(yōu)先級(jí)是 指針 類型 哈希 最后才是值得判斷
- copy 是獲取 所有 _YYModelPropertyMeta 然后判斷類型 之后進(jìn)行復(fù)制
系列化 反序列化
簡(jiǎn)單來說就是 通過 _YYModelPropertyMeta 然后判斷類型, 之后再進(jìn)行序列化和反序列化
一些值得學(xué)習(xí)的細(xì)節(jié)
- YYClassInfo 中利用單例維護(hù)了 一個(gè) chache, 并且使用信號(hào)量來保證安全
- 所有內(nèi)部非繼承非初始化的私有方法都是以 '_' 開頭的, 雖然不一定一定好, 但是在某種程度上也讓代碼更加清晰
- 使用
fine force_inline __inline__ __attribute__((always_inline))
定義內(nèi)聯(lián)函數(shù) - 使用 -> 的方式取值, 更加清晰
- 使用 CF 的方法 和 單利緩存 來提升速度