源码篇:Mantle.doc

  1. 1、本文档共22页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Mantle是一个用于简化Cocoa或Cocoa Touch程序中model层的第三方库。通常我们的应该中都会定义大量的model来表示各种数据结构,而这些model的初始化和编码解码都需要写大量的代码。而Mantle的优点在于能够大大地简化这些代码。 Mantle源码中最主要的内容包括: MTLModel类:通常是作为我们的Model的基类,该类提供了一些默认的行为来处理对象的初始化和归档操作,同时可以获取到对象所有属性的键值集合。 MTLJSONAdapter类:用于在MTLModel对象和JSON字典之间进行相互转换,相当于是一个适配器。 MTLJSONSerializing协议:需要与JSON字典进行相互转换的MTLModel的子类都需要实现该协议,以方便MTLJSONApadter对象进行转换。 在此就以这三者作为我们的分析点。 基类MTLModel MTLModel是一个抽象类,它主要提供了一些默认的行为来处理对象的初始化和归档操作。 初始化 MTLModel默认的初始化方法-init并没有做什么事情,只是调用了下[super init]。而同时,它提供了一个另一个初始化方法: -(instancetype)initWithDictionary:(NSDictionary*)dictionaryValueerror:(NSError**)error;其中参数dictionaryValue是一个字典,它包含了用于初始化对象的key-value对。我们来看下它的具体实现: -(instancetype)initWithDictionary:(NSDictionary*)dictionaryerror:(NSError**)error{...for(NSString*keyindictionary){//1.将value标记为__autoreleasing,这是因为在MTLValidateAndSetValue函数中,//可以会返回一个新的对象存在在该变量中__autoreleasingidvalue=[dictionaryobjectForKey:key];//2.value如果为NSNull.null,会在使用前将其转换为nilif([valueisEqual:NSNull.null])value=nil;//3.MTLValidateAndSetValue函数利用KVC机制来验证value的值对于key是否有效,//如果无效,则使用使用默认值来设置key的值。//这里同样使用了对象的KVC特性来将value值赋值给model对应于key的属性。//有关MTLValidateAndSetValue的实现可参考源码,在此不做详细说明。BOOLsuccess=MTLValidateAndSetValue(self,key,value,YES,error);if(!success)returnnil;}...}子类可以重写该方法,以在设置完对象的属性后做进一步的处理或初始化工作,不过需要记住的是:应该通过super来调用父类的实现。 获取属性的键(key)、值(value) MTLModel类提供了一个类方法+propertyKeys,该方法返回所有@property声明的属性所对应的名称字符串的一个集合,但不包括只读属性和MTLModel自身的属性。在这个类方法会去遍历model的所有属性,如果属性是非只读且其ivar值不为NULL,则获取到表示属性名的字符串,并将其放入到集合中,其实现如下: +(NSSet*)propertyKeys{//1.如果对象中已有缓存的属性名的集合,则直接返回缓存。该缓存是放在一个关联对象中。NSSet*cachedKeys=objc_getAssociatedObject(self,MTLModelCachedPropertyKeysKey);if(cachedKeys!=nil)returncachedKeys;NSMutableSet*keys=[NSMutableSetoperty,BOOL*stop){mtl_propertyAttributes*attributes=mtl_copyPropertyAttributes(property);@onExit{free(attributes);};//3.过滤只读属性和ivar为NULL的属性if(attributes-readonlyattributes-ivar==NULL)return;//4.获取属性名字符串,并存储到集合中NSString*key=@(property_getName(property));[keysaddObject:key];}];//5.将集合缓存到关联对象中。objc_setAssociatedObj

文档评论(0)

宝贝计划 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档