YYModel
简单一看 YY 的代码规模就是和其他库没有办法相比的, 只有两个文件
其中把一个类的信息拆分为下面这几种类
- YYClassInfo
- YYClassIvarInfo
- YYClassMethodInfo
- YYClassPropertyInfo
还有两个私有的类, 用来解析用户设定的自定义模型, 通过这两个类的分析, 来快速的得知如何去进行转化
- _YYModelPropertyMeta
- _YYModelMeta
简单说一下解析流程
1 获取要解析为的对象的 CLASS, 并生成实例
2 调用这个对象的 yy_modelSetWithDictionary 方法
2.1 这个方法会在转化前后判断是否需要执行 modelCustomWillTransformFromDictionary 和 modelCustomTransformFromDictionary 方法
2.2 使用 CFDictionaryApplyFunction 等一系列 CF 赋值
转化回来的流程是这样的
1 所有的方法最后都会调用到一个 ModelToJSONObjectRecursive 的函数上
1.1 这个函数做的事情基本就是判断类型 然后递归转化, 最后传出来一个只有基本类型的对象
1.2 其中如果是自定义的类 那么仍然需要 获取 _YYModelMeta 然后进行转化
1.3 如果用户提供了 modelCustomTransformToDictionary 方法, 那么根据用户自己的方法来再进行一次额外的转化
2 转化完之后再根据各自不同的需求转化为相应的类型
复制, equal, hash 等的判断逻辑
- hash 是获取 _YYModelMeta 和 每一个 _YYModelPropertyMeta 然后 ^= 每一个属性的 hash 值
- equal 的的判断优先级是 指针 类型 哈希 最后才是值得判断
- copy 是获取 所有 _YYModelPropertyMeta 然后判断类型 之后进行复制
系列化 反序列化
简单来说就是 通过 _YYModelPropertyMeta 然后判断类型, 之后再进行序列化和反序列化
一些值得学习的细节
- YYClassInfo 中利用单例维护了 一个 chache, 并且使用信号量来保证安全
- 所有内部非继承非初始化的私有方法都是以 '_' 开头的, 虽然不一定一定好, 但是在某种程度上也让代码更加清晰
- 使用
fine force_inline __inline__ __attribute__((always_inline))
定义内联函数 - 使用 -> 的方式取值, 更加清晰
- 使用 CF 的方法 和 单利缓存 来提升速度