打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
JSON对象自动生成ObjC对象
9Tech·iOS开发交流群:219960444


当我们在实现客户端项目的时候,与服务器的数据交互一般都是使用json,因为其格式简洁,数据量小,解析速度快,所以使用特别广泛。在JAVA中,我们使用反射可以将json对象自动生成一个实体对象,在Objective-C中,我们虽然没有反射的概念,但是我们可以使用objc的动态运行库和KVC来模拟完成这一操作。下面将要介绍的AutoMagicCoding正是借助了这两样工具。
  1.   AutoMagicCoding(https://github.com/psineur/NSObject-AutomagicCoding/),
复制代码

一个可以自动将序列化的对象转换为实例对象的第三方库,功能比较强大。具体的原理如下:通过objc-runtime的class_copyPropertyList方法获得一个已序列化对象的所有变量,然后通过class_getProperty来区分每个变量,接着使用property_getAttributes方法得到该变量所对应的类型,若该变量是普通类型(NSString, NSNumber等),则自动赋值,当该变量是一个自定义类型或者是一个NSArray或者NSDictionary时,就需要做特别的处理了,这也是直接使用KVC不能做到的地方。对于自定义的类型,我们可以通过property_getAttributes中的一个字段取道对应的类名,然后生成, 但是对于容器,由于没有范型的概 念(Objc中的对象大部分都是NSObject,一个另类是继承自NSProxy的对象),也就不能知道它存储的类型是什么了,AutoMagicCoding所采取的办法是当一个对象在序列化的时候就给它添加一个类名存储起来,这样在反序列化的时候根据这个类名来创建对象。但是如果我们本来就没有序列化过这个对象,比如我们取的是从服务器上传回来的json,这该怎么办呢?
   这时候我们可以采用动态加载的方式来生成,即当我们在确定到一个容器是NSArray或者NSDictionary的时候,我们就通过一个接口来返回它所存储的类型。比如一个名为dogList的数组变量,存储了类型为Dog的值,我们只需要在创建dogList的时候手动给dogList添加Dog的类名即可。由于AutoMagicCoding是第三方的库,而且是NSObject的一个扩展,所以我们不方便直接添加接口来动态返回,我在此所做的处理就是继承了一个新的类AMCObject,在这个类里实现预先将容器中的类名都存储到对应的位置,再直接调用父类的时候,它就可以直接生成了,这也算是个动静结合的方式。这样,基本上Model都可以动态生成了,虽然不能像java那样完全自动处理,但是也节省了至少80%的编码转换。
   这个自动生成对象的类,除了上面所存在的固有的问题外,还有一个缺点就是递归,因为在存储类名的时候使用了一遍递归,当生成对象的时候还是得使用递归一层层的创建,所以效率不会很高,但这也不是很大的问题,毕竟在解决这种问题的时候,最常见的方式就是递归,而且现在cpu的速度也很快,影响不会太大。
   除了新增的这个继承类,我还在原来的文件里做了一些小的修改,包括支持arc和非arc的编译,增加对id类型的处理,增加了对自定义类的自动支持,而不用手动增加类名,还修正了一些指针为空,以及内存泄漏方面的问题。这样就基本能满足普通项目的需求了。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
编程语言Python json(反)序列化对象
Java的序列化算法
<objc/rumtime.h>
Objective-C入门教程04:消息(方法)
datasnap 2010 利用JSON序列化和反序列化任何类型的对象
更好的Python对象序列化方式
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服