IOS-MJExtension一句話搞定對(duì)象歸檔

MJExtension很強(qiáng)大,幾乎支持現(xiàn)有所有的模型、字典、json數(shù)據(jù)轉(zhuǎn)換,而且效率非常高

以前寫對(duì)象歸檔的時(shí)候,需要讓這個(gè)對(duì)象實(shí)現(xiàn)NSCoding協(xié)議,而且要對(duì)每一個(gè)需要?dú)w檔的屬性做一些encode和decode操作,例如你之前的代碼可能是這樣子的

Person.h文件

#import"Person.h"@interfacePerson:NSObject@property(nonatomic,copy)NSString*name;@property(nonatomic,assign)intage;@property(nonatomic,assign)BOOLgay;@end

Person.m文件

#import"Person.h"@implementationPerson-(id)initWithCoder:(NSCoder*)aDecoder{if(self= [superinit]) {self.name = [aDecoder decodeObjectForKey:@"name"];NSNumber*at = [aDecoder decodeObjectForKey:@"age"];self.age = at.intValue ;NSNumber*isgay = [aDecoder decodeObjectForKey:@"gay"];self.gay = isgay.intValue;? ? }returnself;}/**

*? 將對(duì)象寫入文件的時(shí)候調(diào)用

*? 怎樣存儲(chǔ)

*

*? @param aCoder aCoder

*/-(void)encodeWithCoder:(NSCoder*)aCoder{? ? [aCoder encodeObject:self.name forKey:@"name"];? ? [aCoder encodeObject:[NSNumbernumberWithInt:self.age] forKey:@"age"];? ? [aCoder encodeObject:[NSNumbernumberWithInt:self.gay] forKey:@"gay"];}@end

這需要重寫initWithCoder和encodeWithCoder這兩個(gè)方法,比較繁瑣,這和Android里面的實(shí)現(xiàn)Parcelable差不多,要寫一大堆的代碼,不過(guò)Android有解決這個(gè)問(wèn)題的方案,通過(guò)安裝AndroidStudio插件來(lái)解決,具體請(qǐng)看AndroidStudio-Parcelable自動(dòng)生成代碼插件安裝和使用這篇文章,其實(shí),iOS里面也有相關(guān)的解決方案,而且比Android實(shí)現(xiàn)更簡(jiǎn)單,快速和高效,一句代碼搞定!

MJExtension非常好用但是容易被忽略的功能:不管你的模型屬性有幾百個(gè),只需要加一句宏MJCodingImplementation,就能實(shí)現(xiàn)歸檔解檔,不用再編寫惡心的encodeWithCoder:和initWithCoder:了

代碼示例如下,Person.h代碼不變,只需要將Person.m文件內(nèi)容改成下面的就OK了:

#import"Person.h"#import"MJExtension.h"@implementationPersonMJCodingImplementation@end

搞定,其實(shí)歸檔和反歸檔代碼本質(zhì)上都要寫,只不過(guò)MJExtension幫我們做了,我們?nèi)c(diǎn)擊這個(gè)MJCodingImplementation去看看,發(fā)現(xiàn)代碼是這樣的:

#import@interfaceNSObject(MJCoding)/**

*? 解碼(從文件中解析對(duì)象)

*/- (void)decode:(NSCoder*)decoder;/**

*? 編碼(將對(duì)象寫入文件中)

*/- (void)encode:(NSCoder*)encoder;@end/**

歸檔的實(shí)現(xiàn)

*/#define MJCodingImplementation \- (id)initWithCoder:(NSCoder*)decoder \{ \if(self= [superinit]) { \[selfdecode:decoder]; \} \returnself; \} \\- (void)encodeWithCoder:(NSCoder*)encoder \{ \[selfencode:encoder]; \}

再看實(shí)現(xiàn)類代碼

#import"NSObject+MJCoding.h"#import"NSObject+MJMember.h"@implementationNSObject(MJCoding)/**

*? 編碼(將對(duì)象寫入文件中)

*/- (void)encode:(NSCoder*)encoder{? ? [selfenumerateIvarsWithBlock:^(MJIvar *ivar,BOOL*stop) {if(ivar.isSrcClassFromFoundation)return;? ? ? ? [encoder encodeObject:ivar.value forKey:ivar.name];? ? }];}/**

*? 解碼(從文件中解析對(duì)象)

*/- (void)decode:(NSCoder*)decoder{? ? [selfenumerateIvarsWithBlock:^(MJIvar *ivar,BOOL*stop) {if(ivar.isSrcClassFromFoundation)return;? ? ? ? ivar.value = [decoder decodeObjectForKey:ivar.name];? ? }];}@end

它其實(shí)就幫我們實(shí)現(xiàn)了把所有屬性都?xì)w檔和反歸檔的操作,那么問(wèn)題來(lái)了,加入我不想所有的文件都?xì)w檔,我只想歸檔name和age屬性,不想歸檔gay屬性,那怎么辦呢?其實(shí)MJExtension已經(jīng)幫我們想好了,只需要調(diào)用一下:

[Person setupIgnoredCodingPropertyNames:^NSArray*{return@[@"gay"];}];

這個(gè)方法就可以了!!!?。。。?!

作者:街角仰望

鏈接:http://www.itdecent.cn/p/7e8af12ab5a4

來(lái)源:簡(jiǎn)書

著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • MJExtension很強(qiáng)大,幾乎支持現(xiàn)有所有的模型、字典、json數(shù)據(jù)轉(zhuǎn)換,而且效率非常高 以前寫對(duì)象歸檔的時(shí)候...
    街角仰望閱讀 3,009評(píng)論 0 4
  • runtime詳解 公司項(xiàng)目用到一個(gè)三方開(kāi)源庫(kù),里面有個(gè)bug,不能改動(dòng)源碼,我想來(lái)想去,只能通過(guò)runtime這...
    3875e78848bf閱讀 848評(píng)論 0 0
  • runtime(簡(jiǎn)稱運(yùn)行時(shí)),是一套 純C(C和匯編寫的) 的API。而 OC 就是 運(yùn)行時(shí)機(jī)制,也就是在運(yùn)行時(shí)候...
    看看外面的世界閱讀 371評(píng)論 0 0
  • 生活因?yàn)檫\(yùn)動(dòng)而精彩,足球帶給球迷無(wú)比的興奮。2018年,足球世界杯又來(lái)了!在你的生命里,你經(jīng)歷了多少屆激動(dòng)...
    常樂(lè)彬閱讀 354評(píng)論 0 0
  • 人這一生總有那么多遺憾,譬如愛(ài)情,譬如抱負(fù)……可悲的是,有的人在最好的年紀(jì)碰到最壞的時(shí)代,與幸運(yùn)失之交臂;有的人卻...
    諸葛不靚的故襄閱讀 464評(píng)論 0 0

友情鏈接更多精彩內(nèi)容