根据JSON生成Model是一个iOS开发经常用到的内容,这方面开源的也很多,比如我们公司用的Mantel,但其实效率很一般,最近看了YYModel,区区五个文件,功能简单且高效,于是就认真学习一下人家是怎么实现的。
在我想来,主要就是通过runtime方法获取property和ivar就可以了,通过判断每个ivar的类型,然后根据不同的类型给每个property赋值,应该算是不太难的。在网上看到了这篇文章,就是我想的这个样子,但是YYModel的作者可不是这么认为的。
作者首先通过runtime方法,生成YYClassInfo,其中YYClassInfo主要是取了YYClassIvarInfo,YYClassMethodInfo,YYClassPropertyInfo。然后通过YYClassInfo构造YYModelMeta。
YYModelMeta里面包括YYModelPropertyMeta
这个过程中,我还有些疑问的,为啥一定要构造这么多中间类呢?咱们继续往下看。
实际的操作过程中,YYClassIvarInfo和YYClassMethodInfo都没有用到,主要就是用到了YYClassPropertyInfo,由此构造YYModelPropertyMeta,再生成YYModelMeta。
作者都采用了CoreFoundition类型,比如CFStringRef,CFArrayRef等的操作,相对于 Foundation 的方法来说,CoreFoundation 的方法有更高的性能,用 CFArrayApplyFunction() 和 CFDictionaryApplyFunction() 方法来遍历容器类能带来不少性能提升,以及赋值也是采用objc_sendMsg的方法,就是为了快,省去很多OC方法的查找,这就不难理解,作者为什么用那么多的中间类来记录Method,Ivar,property的setter和getter了。
作者在文章中对各个开源库进行了对比,图文声茂,功底了得,膜拜一把。