- 1、本文档共22页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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
您可能关注的文档
- 员工的激励与稳定.ppt
- 员工沟通与关怀实施方案.pptx
- 员工关系管理教学大纲(32学时).doc
- 员工行为考核制度.doc
- 员工环境保护知识培训.ppt
- 员工激励系统.ppt
- 员工奖惩与纪律管理(10月18日课件).ppt
- 员工敬业度与公司业绩、文化(Employee Engagement Business Result Culture Hewitt).ppt
- 员工劳动管理细则.ppt
- 员工流失原因及对策.doc
- 新的一年工作展望.docx
- 医生年终个人工作的述职报告(3篇).docx
- 2023年消防设施操作员之消防设备中级技能考前冲刺练习题附答案详解.docx
- 2022-2023年环境影响评价工程师之环评技术导则与标准通关练习题包括详细解答.docx
- 2023年中级注册安全工程师之安全生产管理考前冲刺检测卷和答案.docx
- 2023年中级银行从业资格之中级银行管理考前冲刺测试卷提供答案解析.docx
- 2023年公共营养师之二级营养师通关模拟考试试卷附带答案.docx
- 证券分析师之发布证券研究报告业务考前冲刺模拟题库.docx
- 2022-2023年二级建造师之二建建设工程法规及相关知识综合提升测试卷附答案.docx
- 2023年二级建造师之二建机电工程实务通关模拟考试试卷提供答案解析.docx
文档评论(0)