YYModel源码学习,腾讯团队实力打造flutter入门教程

87 阅读3分钟




##YYClassMethodInfo  

类结构中主要包含SEL、IMP、name等一些基本属性,用于保存函数的信息



通过以下函数进行赋值



  • (instancetype)initWithMethod:(Method)method;



##YYClassPropertyInfo  

类结构中包含name、gettersetter属性,用于保存成员属性的信息。通过以下函数进行赋值



  • (instancetype)initWithProperty:(objc_property_t)property;




##YYClassInfo  

类结构中包含superCls、metaCls、name等一些类相关的信息。同时也将上述三个类做为类的一部分。通过以下函数进行赋值。



  • (nullable instancetype)classInfoWithClass:(Class)cls;



此函数做了2部分工作,1)判断是否有缓存,有的话就取缓存数据 2)没有缓存数据的话通过以下函数进行赋值然后缓存。



  • (instancetype)initWithClass:(Class)cls;



**\_YYModelPropertyMeta**  

类结构中主要包含  

YYClassPropertyInfo对象、  

name、mappedToKey等一些相关的信息,用来描述当前实例的属性信息。



通过以下函数进行赋值



  • (instancetype)metaWithClassInfo:(YYClassInfo *)classInfo propertyInfo:(YYClassPropertyInfo *)propertyInfo generic:(Class)generic;



**\_YYModelMeta**  

类结构中包含了当前类的信息和不同情况下的属性数组。看定义的类结构最直观。



@interface _YYModelMeta : NSObject {

YYClassInfo *_classInfo;

/// Key:mapped key and key path, Value:_YYModelPropertyMeta.

NSDictionary *_mapper;

   /// Array, all property meta of this model.

NSArray *_allPropertyMetas;

/// Array, property meta which is mapped to a key path.

NSArray *_keyPathPropertyMetas;

/// Array, property meta which is mapped to multi keys.

NSArray *_multiKeysPropertyMetas;

/// The number of mapped key (and key path), same to _mapper.count.

NSUInteger _keyMappedCount;

//剩下的省略。。

}




[]( )**数据流向**

--------------------------------------------------------------------------



看完类的大致结构,再来看下从调用YYModel提供给我们的接口开始,函数之间是如何跳转的,传入的参数又经过了那几道转换。



###yy\_modelWithJSON  

该接口接受NSDictionary, NSString,NSData三种类型的json串,返回一个新的是实例对象。实现主要包含以下两部分,重点在第二个函数实现。



[self _yy_dictionaryWithJSON:json] //转成NSDictionary类型数据

[self yy_modelWithDictionary:dic] //传入NSDictionary数据,返回实例对象




来看下yy\_modelWithDictionary是如何将dic数据转换成对象的。核心的函数也是两个。



//根据调用的类,对YYClassIvarInfo、YYClassMethodInfo、YYClassPropertyInfo、YYClassInfo、_YYModelPropertMeta、_YYModelMeta进行赋值

[_YYModelMeta metaWithClass:cls]

//对类的属性进行赋值操作

[one yy_modelSetWithDictionary:dictionary]




通过这3个函数就实现了json串到对象的转换,看似简单,其实函数中还包含不少逻辑,还是以图的形式来的实在。看下图,函数的执行顺序从左到右



[![image](https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/5fed138c52bb4fc5bec3e5e555fdef19~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDY4Mzc0MTQxMzQ0:q75.awebp?rk3s=f64ab15b&x-expires=1771892663&x-signature=uSG5W93YwDlplLuxW3P5%2BfrmMC0%3D)](https://img.colabug.com/2018/07/aaf9502f0e2ca49392fb19af8aaff259.png "YYModel源码学习")



[]( )yy\_modelToJSONObject
最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套**腾讯、字节跳动、阿里、百度2020-2021面试真题解析**,我把技术点整理成了**视频和PDF**(实际上比预期多花了不少精力),包**知识脉络 + 诸多细节**。

还有 **高级架构技术进阶脑图、Android开发面试专题资料** 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

![一线互联网面试专题](https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/6098fcbaa3474d78b6257dd8e7893c02~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDY4Mzc0MTQxMzQ0:q75.awebp?rk3s=f64ab15b&x-expires=1771892663&x-signature=cXWvS95vgAHQQJYM7hImLfQ7MSk%3D)

![379页的Android进阶知识大全](https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/b1d22900db6a4d86a9d728fd37af3def~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDY4Mzc0MTQxMzQ0:q75.awebp?rk3s=f64ab15b&x-expires=1771892663&x-signature=mrXGAgBigIrRr6YJ2DIwVKFfmZw%3D)

![379页的Android进阶知识大全](https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/0b22c661ab074d15b7f9a4788e7821dd~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDY4Mzc0MTQxMzQ0:q75.awebp?rk3s=f64ab15b&x-expires=1771892663&x-signature=nt2b1fEQGBa30%2BhT83AYddnXigo%3D)

**点击:**

《[Android架构视频+BAT面试专题PDF+学习笔记](https://github.com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)》即可免费获取~

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。