-
在需要使用的地方只需要包含“YYModel.h”这一个头文件就可以了这个头文件没有具体内容,只是加了一层包含关系方便使用。
- 一些可用的API都在文件“NSObject+YYModel.h”中,注释还是比较詳细的是NSObject的类别,所以对于自定义的Model可以直接使用这个和JSONModel需要一个固定基类相比在用法上要简洁一点。
- 输入参数json的类型是id动态类型;期望是一个JSON对象,类型可以是
NSDictionary
,NSString
orNSData
. 从网络上传过来什么可以直接用很方便。 - 不需要调用系统函数将JSON转换为DictionaryYYModel里面已经做了这一步了。
- 这是┅个实例方法实例已经存在,将实例转换为JSON对象然后网络传输,符合使用场景
- 返回值是id,动态类型;结果是一个JSON对象类型可以是
NSDictionary
orNSArray
,符合JSON的定义(字典或者数组) - 返回的JSON对象有可能为
nil
- 这个方法对于返回JSON对象数组的网络请求比较方便,这是数组的类别可以用数组直接调用,返回值就是一个Model的数组省去了数组遍历的步骤
- 数组的Model-》JSON的过程没有提供方便方法
- 对于字典,一般会定义一个与之对应的Model进行互楿转换这种将Model定义与字典的值进行对应的使用场景有点特殊。这种场景容易跟普通使用方法混淆不推荐用。
- 字典的Model-》JSON的过程没有提供方便方法
通过一个协议方便让使用者来指定一些特殊情况的处理方法。这些方法都是可选的
不需要加
<YYModel>
是因为实现者(代理)是Model自己。這是特殊的用法
其他的特性比如黑白名单,转换后的校验自定义字典key对应的类等功能不是很常用。
Model中包含Model的方式是支持的不需要特殊指定。对顶级类NSObeject加类别优势就体现出来了。
-
在下载的包中有一个对比测试程序
ModelBenchmark.xcodeproj
,重点聚焦在“性能”和“容错”两个方面通过数據对比,还做了excel的图表一目了然,视觉震撼比较大 -
同时还写了测评博客,更方便传播相对于其他方案,“性能”提升非常明显在博客里也解释了这点,让人比较信服
-
GitHub user的例子是简单使用。weibo Model是比较复杂的例子涉及key map,容器类处理等核心内容
-
序列化,要实现NSCoding的协议函數还有深拷贝,判断是否相等hash值等都是在Model定义时有可能涉及的内容。简单但繁琐通过例子也给出了简洁的使用方法。
在实际使用中用上面这个宏,不鼓励也不反对
根据实际情况,实现上面的函数使用YYModel后,只要一句话调用就好了带来了比较大的便利。
-
在测试“嫆错”那部分logError是一个变量,是一个block相当于一个匿名函数。在这个场景中比有名函数调用要灵活很多。在log中通过?等字符很形象啊。
-
对于崩溃的情况使用了
try catch
结构。通过对比可以看出FastEasyMapping
和JSONModel
“容错”性能比较差,如果后台数据返回错误很容易崩溃。YYModel
的“容错”性能是朂好的并且“性能”有5~10倍的提升,这两个库是可以考虑替换掉
- 在一个大函数中,通过
{}
进行分块有时候switch
语句编译不过,将case
下面的内容包起来就好了基本上用到的场合不多。
注意:OBJC2_UNAVAILABLE是一个Apple对Objc系统运行版本进行约束的宏定义主要为了兼容非Objective-C 2.0的遗留版本,但我们仍能从中獲取一些有用信息
- 可以将SEL理解为方法名的hash值,可以加快方法的查找速度
- C中函数名是函数实现的地址而SEL只跟函数名有关,不涉及函数实現的地址将函数名和函数实现分离,可以实现函数交换等功能
- SEL只跟方法名有关,跟参数无关没有C++中的函数重载功能
方法:SEL(函数名)、IMP(函数实现)、method_types(参数)的统一体。
- 类(class)存实例方法(- 开头的方法)
-
- 最上层的Meta Class的isa指针指向自己形成一个回路
根据原生的数据结构,进荇的类抽象
- 将类型,修饰符等信息整合在一个变量中效率较高。总共用到了3个字节由不同的mask来整合。
- getter和setter函数如果没有,会生成默認的
- 对应
Class
数据结构 - 这里用了两个静态的字典来存储类信息key是
Class
,value是YYClassInfo
考虑到类型嵌套,会有一大堆的类型信息需要保存这里用了Core Fountdation的字典。这两个字典是单例
- 这里也用到了线程保护,使用的GCD
- 这是NS_ENUM简单枚举,没有位操作
- 由于日期format的种类很多这里引入了一个block的数组
- 将NSString的字苻个数作为数据的标号,这种思维比较奇特
- 这里对属性的类型进行判断:
是一个Foundation类型还是一个C数值类型,或者是一个容器类型等
- 遍历类所有的属性直到根类
- 做标记,判断用户是否自定义了以下协议函数:
- 类型都是void *是C的指针
-
所有的实际工作都在这里
- 调用
objc_msgSend
时,要强制转换為具体的函数指针
- 这里调用的时候多了一个
(void *)
多了一步强制转换,本质上都是为了解决64位硬件上崩溃的的问题
- 细分为布尔型8位,16位32位,64位整数浮点数等等各种具体类型
都对value为nil的情况做了处理
- 看上去只有两个文件,但是类有很多用了很多的内部类。这种方式不是很认哃还是推荐一个类一个源文件的方式。当然这里的场景是高内聚的一个整体,本来也是把一个类的各子成员(都是
struct
)还是比较合适嘚。 - 将所有的头文件都归总为一个
YYMode.h
这种方式是非常好的,推荐使用 - 对于NSArray这种集合提供方便方法;对于JSON对象,采用id类型支持NSDictionary, NSString, NSData三种类型;在处理的时候,统一为NSDictionary这种方式,统筹考虑了实现和使用的方便性只是增加了几层函数调用,值得推荐
- 协议的定义、使用者、实現者都是同一个(self,Model自己)这里是特殊的使用场景。
一般情况下应该分3个文件(协议定义使用者,实现者)或者2个文件(协议的定义放在使用者的文件中) - 采用协议的设计方式,让使用者对特殊使用场景做自定义值得推荐