##YYClassMethodInfo
类结构中主要包含SEL、IMP、name等一些基本属性,用于保存函数的信息
通过以下函数进行赋值
- (instancetype)initWithMethod:(Method)method;
##YYClassPropertyInfo
类结构中包含name、getter、setter属性,用于保存成员属性的信息。通过以下函数进行赋值
- (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串到对象的转换,看似简单,其实函数中还包含不少逻辑,还是以图的形式来的实在。看下图,函数的执行顺序从左到右
[](https://img.colabug.com/2018/07/aaf9502f0e2ca49392fb19af8aaff259.png "YYModel源码学习")
[]( )yy\_modelToJSONObject
最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套**腾讯、字节跳动、阿里、百度2020-2021面试真题解析**,我把技术点整理成了**视频和PDF**(实际上比预期多花了不少精力),包**知识脉络 + 诸多细节**。
还有 **高级架构技术进阶脑图、Android开发面试专题资料** 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。



**点击:**
《[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的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。