简单学习 YYModel

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 的方法 和 单利缓存 来提升速度

你可能感兴趣的:(简单学习 YYModel)