




已阅读5页,还剩51页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第十二章、归档,内容概要,使用XML属性列表进行归档使用NSKeyedArchiver归档编码方法和解码方法使用NSData创建自定义档案使用归档程序复制对象,使用XML属性列表进行归档,归档的概念:用某种格式来保存一个或多个对象,以便以后还原这些对象的过程。通过这个过程包括将(多个)对象写入文件,以便以后读回该对象归档的方式:属性列表和带键值的编码,使用XML属性列表进行归档,XML属性列表的内容:默认参数选择、应用程序设置和配置信息等采用属性列表进行归档存储的信息是有限的,因为并没有保存对象所属的类信息,没有存储对象的多个引用,也没有保持对象的可变性属性列表归档只针对于Foundation对象,使用XML属性列表进行归档,写入文件:对于Foundation的类,你可以使用在这些类中实现的writeToFile:atomically:方法将数据写到文件中,使用XML属性列表进行归档,/Program19.1#import#import#import#importintmain(intargc,char*argv)NSAutoreleasePool*pool=NSAutoreleasePoolallocinit;NSDictionary*glossary=NSDictionarydictionaryWithObjectsAndKeys:Aclassdefinedsootherclassescaninheritfromit.,abstractclass,Toimplementallthemethodsdefinedinaprotocol,adopt,Storinganobjectforlateruse.,archiving,nil;,使用XML属性列表进行归档,if(glossarywriteToFile:glossaryatomically:YES=NO)NSLog(Savetofilefailed!);pooldrain;return0;,希望首先将字典写入临时备份文件中,写入成功后,将把最终数据转移到名为glossary的指定文件中。这项安全措施可使得文件在执行操作的过程中崩溃时免受破坏。,使用XML属性列表进行归档,glossary文件的内容如下:,/*IfyouexaminethecontentsoftheglossaryfilecreatedbyProgram19.1,itlookslikethis:*/abstractclass/属性列表Aclassdefinedsootherclassescaninheritfromit.adoptToimplementallthemethodsdefinedinaprotocolarchivingStoringanobjectforlateruse.,使用XML属性列表进行归档,【注意】根据字典创建属性列表时,字典中的键必须全是NSString对象。字典中的值可以是NSString、NSArray、NSDictionary、NSData、NSNumber对象,使用XML属性列表进行归档,从文件中读取:dictionaryWithContentOfFile:arrayWithContentOfFile:stringWithContentOfFile:dataWithContentsOfFile:.,使用XML属性列表进行归档,/Program19.2#import#import#import#import#importintmain(intargc,char*argv)NSAutoreleasePool*pool=NSAutoreleasePoolallocinit;NSDictionary*glossary;glossary=NSDictionarydictionaryWithContentsOfFile:glossary;for(NSString*keyinglossary)NSLog(%:%,key,glossaryobjectForKey:key);pooldrain;return0;,使用XML属性列表进行归档,【注意】属性列表文件不必一定由程序创建,可以来自文本编辑器,或/Developer/Applications/Utilities下的PropertyListEditor,Program19.2Output:archiving:Storinganobjectforlateruse.abstractclass:Aclassdefinedsootherclassescaninheritfromit.adopt:Toimplementallthemethodsdefinedinaprotocol,内容概要,使用XML属性列表进行归档使用NSKeyedArchiver归档编码方法和解码方法使用NSData创建自定义档案使用归档程序复制对象,使用NSKeyedArchiver归档,属性列表归档只针对Foundation类。要想将各种类型的对象存储到文件中,可以采用NSKeyedArchiver归档头文件:,使用NSKeyedArchiver归档(cont.),【注意】1、MacOXX从版本10.2开始支持带键的档案。在此之前,要使用NSArchiver类创建连续的归档。连续的归档需要完全按照写入时的顺序读取归档中的数据2、在带键的档案中,每个归档字段都有一个名称。归档某个对象时,会为它提供一个键。从归档中检索该对象时,需根据键来检索这样可以按照任意的顺序将对象写入归档并进行检索。4、iPhoneSDK中没有提供NSArchiver。如果想在iPhone上使用归档功能,则必须使用NSKeyedArchiver,使用NSKeyedArchiver归档(cont.),写入文件:archiveRootObject:toFile:方法将对象存储到磁盘上。,使用NSKeyedArchiver归档(cont.),/DEMO19-3#import#import#import#import#importintmain(intargc,char*argv)NSAutoreleasePool*pool=NSAutoreleasePoolallocinit;NSDictionary*glossary=NSDictionarydictionaryWithObjectsAndKeys:Aclassdefinedsootherclassescaninheritfromit,abstractclass,Toimplementallthemethodsdefinedinaprotocol,adopt,使用NSKeyedArchiver归档(cont.),Storinganobjectforlateruse,archiving,nil;NSKeyedArchiverarchiveRootObject:glossarytoFile:glossary.archive;poolrelease;return0;,使用NSKeyedArchiver归(cont.),从文件读取:通过NSKeyedUnarchiver的unArchiverObjectWithFile:方法将创建的归档文件读入执行程序中,使用NSKeyedArchiver归档(cont.),/Program19.4#import#import#import#import#import#importintmain(intargc,char*argv)NSAutoreleasePool*pool=NSAutoreleasePoolallocinit;NSDictionary*glossary;glossary=NSKeyedUnarchiverunarchiveObjectWithFile:glossary.archive;for(NSString*keyinglossary)NSLog(%:%,key,glossaryobjectForKey:key);pooldrain;return0;,使用NSKeyedArchiver归档(cont.),Program19.4Output:abstractclass:Aclassdefinedsootherclassescaninheritfromit.adopt:Toimplementallthemethodsdefinedinaprotocolarchiving:Storinganobjectforlateruse.,内容概要,使用XML属性列表进行归档使用NSKeyedArchiver归档编码方法和解码方法使用NSData创建自定义档案使用归档程序复制对象,编码方法和解码方法,可以使用以上的方法归档和恢复NSStrng、NSArray、NSDictionary、NSSet等基本的Objective-C类对象通常自定义的类不能直接归档,比如归档AddressBook,若对其归档则会出现如下的错误提示,*-AddressBookencodeWithCoder:selectornotrecognized*Uncaughtexception:*-AddressBookencodeWithCoder:selectornotrecognized,编码方法和解码方法:(cont.),若要归档必须使该类遵守协议,在该类中添加encodeWithCoder:方法和initWithCoder:方法以实现归档对象和恢复对象编码方法一般应指定如何归档想要保存的对象中的每个实例变量。,编码方法和解码方法:(cont.),下面列出带键的归档中编码和解码的方法对于基本的Objective-C类,可以使用encodeObject:forKey:和decodeObjectforKey:编码和解码,Table19.1EncodingandDecodingBasicDataTypesinKeyedArchivesEncoderDecoderencodeBool:forKey:decodeBoolforKey:encodeInt:forKey:decodeIntforKey:encodeInt32:forKey:decodeInt32forKey:encodeInt64:forKey:decodeInt64forKey:encodeFloat:forKey:decodeFloatforKey:encodeDouble:forKey:decodeDoubleforKey:,编码方法和解码方法:(cont.),/基本的Objective-C类编码和解码示例:/Program19_6Addresscard.hInterfaceFile#importinterfaceAddressCard:NSObjectNSString*name;NSString*email;property(nonatomic,copy)NSString*name,*email;-(void)setName:(NSString*)theNameandEmail:(NSString*)theEmail;-(void)retainName:(NSString*)theNameandEmail:(NSString*)theEmail;-(NSComparisonResult)compareNames:(id)element;-(void)print;end,编码方法和解码方法:(cont.),#importAddressCard.himplementationAddressCardsynthesizename,email;-(void)setName:(NSString*)theNameandEmail:(NSString*)theEmailselfsetName:theName;selfsetEmail:theEmail;/Comparethetwonamesfromthespecifiedaddresscards-(NSComparisonResult)compareNames:(id)elementreturnnamecompare:elementname;,编码方法和解码方法:(cont.),-(void)printNSLog(=);NSLog(|);NSLog(|%-31s|,nameUTF8String);NSLog(|%-31s|,emailUTF8String);NSLog(|);NSLog(|);NSLog(|);NSLog(|OO|);NSLog(=);-(AddressCard*)copyWithZone:(NSZone*)zoneAddressCard*newCard=AddressCardallocWithZone:zoneinit;newCardretainName:nameandEmail:email;returnnewCard;,编码方法和解码方法:(cont.),-(void)retainName:(NSString*)theNameandEmail:(NSString*)theEmailname=theNameretain;email=theEmailretain;-(void)encodeWithCoder:(NSCoder*)encoderencoderencodeObject:nameforKey:AddressCardName;encoderencodeObject:emailforKey:AddressCardEmail;-(id)initWithCoder:(NSCoder*)decodername=decoderdecodeObjectForKey:AddressCardNameretain;email=decoderdecodeObjectForKey:AddressCardEmailretain;returnself;,编码方法和解码方法:(cont.),-(void)deallocnamerelease;emailrelease;superdealloc;end,编码方法和解码方法:(cont.),#importAddressCard.hinterfaceAddressBook:NSObjectNSString*bookName;NSMutableArray*book;property(nonatomic,copy)NSString*bookName;property(nonatomic,copy)NSMutableArray*book;-(id)initWithName:(NSString*)name;-(void)sort;-(void)addCard:(AddressCard*)theCard;-(void)removeCard:(AddressCard*)theCard;-(int)entries;-(void)list;-(AddressCard*)lookup:(NSString*)theName;-(void)dealloc;end,编码方法和解码方法:(cont.),#importAddressBook.himplementationAddressBooksynthesizebook,bookName;/setuptheAddressBooksnameandanemptybook-(id)initWithName:(NSString*)nameself=superinit;if(self)bookName=NSStringallocinitWithString:name;book=NSMutableArrayallocinit;returnself;-(void)sortbooksortUsingSelector:selector(compareNames:);,编码方法和解码方法:(cont.),-(void)addCard:(AddressCard*)theCardbookaddObject:theCard;-(void)removeCard:(AddressCard*)theCardbookremoveObjectIdenticalTo:theCard;-(int)entriesreturnbookcount;,编码方法和解码方法:(cont.),-(void)listNSLog(=Contentsof:%=,bookName);for(AddressCard*theCardinbook)NSLog(%-20s%-32s,theCUTF8String,theCard.emailUTF8String);NSLog(=);/lookupaddresscardbynameassumesanexactmatch-(AddressCard*)lookup:(NSString*)theNamefor(AddressCard*nextCardinbook)if(nextCardnamecaseInsensitiveCompare:theName=NSOrderedSame)returnnextCard;returnnil;,编码方法和解码方法:(cont.),-(void)deallocbookNamerelease;bookrelease;superdealloc;-(void)encodeWithCoder:(NSCoder*)encoderencoderencodeObject:bookNameforKey:AddressBookBookName;encoderencodeObject:bookforKey:AddressBookBook;-(id)initWithCoder:(NSCoder*)decoderbookName=decoderdecodeObjectForKey:AddressBookBookNameretain;book=decoderdecodeObjectForKey:AddressBookBookretain;returnself;,编码方法和解码方法:(cont.),/MethodforNSCopyingprotocol-(id)copyWithZone:(NSZone*)zoneAddressBook*newBook=selfclassallocWithZone:zone;newBookinitWithName:bookName;newBooksetBook:book;returnnewBook;end,编码方法和解码方法:(cont.),#importAddressBook.h#importintmain(intargc,char*argv)NSString*aName=JuliaKochan;NSString*aEmail=jewls337;NSString*bName=TonyIannino;NSString*bEmail=tony.iannino;NSString*cName=StephenKochan;NSString*cEmail=stevesteve_;NSString*dName=JamieBaker;NSString*dEmail=jbaker;NSAutoreleasePool*pool=NSAutoreleasePoolallocinit;AddressCard*card1=AddressCardallocinit;AddressCard*card2=AddressCardallocinit;AddressCard*card3=AddressCardallocinit;AddressCard*card4=AddressCardallocinit;AddressBook*myBook=AddressBookalloc;,编码方法和解码方法:(cont.),/Firstsetupfouraddresscardscard1setName:aNameandEmail:aEmail;card2setName:bNameandEmail:bEmail;card3setName:cNameandEmail:cEmail;card4setName:dNameandEmail:dEmail;myBook=myBookinitWithName:StevesAddressBook;/AddsomecardstotheaddressbookmyBookaddCard:card1;myBookaddCard:card2;myBookaddCard:card3;myBookaddCard:card4;myBooksort;,编码方法和解码方法:(cont.),if(NSKeyedArchiverarchiveRootObject:myBooktoFile:addrbook.arch=NO)NSLog(archivingfailed);card1release;card2release;card3release;card4release;myBookrelease;pooldrain;return0;,编码方法和解码方法:(cont.),/Program19.7Addresscard.hInterfaceFile对AddressBook解码#importAddressBook.h#importintmain(intargc,char*argv)AddressBook*myBook;NSAutoreleasePool*pool=NSAutoreleasePoolallocinit;myBook=NSKeyedUnarchiverunarchiveObjectWithFile:addrbook.arch;myBooklist;pooldrain;return0;,Program19.7Output=Contentsof:StevesAddressBook=JamieBakerjbakerJuliaKochanjewls337StephenKochanstevesteve_TonyIanninotony.iannino=,编码方法和解码方法:(cont.),/DEMO19_8对内置类行数据编码示例interfaceFoo:NSObjectNSString*strVal;intintVal;floatfloatVal;property(copy,nonatomic)NSString*strVal;propertyintintVal;propertyfloatfloatVal;end,编码方法和解码方法:(cont.),implementationFoosynthesizestrVal,intVal,floatVal;-(void)encodeWithCoder:(NSCoder*)encoder/对每个实例变量编码encoderencodeObject:strValforKey:”FoostrVal”;encoderencodeInt:intValforKey:”FoointVal”;encoderencodeFloat:floatValforKey:”FoofloatVal”;-(id)initWithCoder:(NSCoder*)decoder/解码每个实例变量strVal=decoderdecodeObjectForKey:”FoostrVal”retain;intVal=decoderdecodeIntForKey:”FoointVal”;floatVal=decoderdecodeFloatForKey:”FoofloatVal”;returnself;end,编码方法和解码方法:(cont.),#import#import#import#import#import“Foo.h”/DefinitionforourFooclassintmain(intargc,char*argv)NSAutoreleasePool*pool=NSAutoreleasePoolallocinit;Foo*myFoo1=Fooallocinit;Foo*myFoo2;myFoo1setStrVal:”Thisisthestring”;myFoo1setIntVal:12345;myFoo1setFloatVal:98.6;NSKeyedArchiverarchiveRootObject:myFoo1toFile:”foo.arch”;myFoo2=NSKeyedUnarchiverunarchiveObjectWithFile:”foo.arch”;NSLog(”%n%in%g”,myFoo2strVal,myFoo2intVal,myFoo2floatVal);myFoo1release;pooldrain;return0;,Program19.8Output:Thisisthestring1234598.6,内容概要,使用XML属性列表进行归档使用NSKeyedArchiver归档编码方法和解码方法使用NSData创建自定义档案使用归档程序复制对象,使用NSData创建自定义档案,有时可能不希望使用archiveRootObject:ToFile:方法将对象直接写入文件,而是临时放到有NSData对象创建的临时存储空间中保存NSData对象用来保存一块内存空间作为临时存储数据的空间dataArea1=NSMutableDatadata;dataArea2=NSDatadata;,使用NSData创建自定义档案:(cont.),/Program19_9编码#import#import#import#import#import#import#importAddressBook.h#importFoo.hintmain(intargc,char*argv)NSAutoreleasePool*pool=NSAutoreleasePoolallocinit;Foo*myFoo1=Fooallocinit;Foo*myFoo2;NSMutableData*dataArea;NSKeyedArchiver*archiver;AddressBook*myBook;,使用NSData创建自定义档案:(cont.),/InsertcodefromProgram19.7tocreateanAddressBook/inmyBookcontainingfouraddresscardsmyFoo1setStrVal:Thisisthestring;myFoo1setIntVal:12345;myFoo1setFloatVal:98.6;/SetupadataareaandconnectittoanNSKeyedArchiverobjectdataArea=NSMutableDatadata;archiver=NSKeyedArchiverallocinitForWritingWithMutableData:dataArea;/NowwecanbegintoarchiveobjectsarchiverencodeObject:myBookforKey:myaddrbook;archiverencodeObject:myFoo1forKey:myfoo1;archiverfinishEncoding;/Writethearchiveddatatoafileif(dataAreawriteToFile:myArchiveatomically:YES=NO)NSLog(Archivingfailed!);,使用NSData创建自定义档案:(cont.),archiverrelease;myFoo1release;pooldrain;return0;,使用NSData创建自定义档案:(cont.),/Program19_10解码#import#import#import#import#import#import#importAddressBook.h#importFoo.hintmain(intargc,char*argv)NSAutoreleasePool*pool=NSAutoreleasePoolallocinit;NSData*dataArea;NSKeyedUnarchiver*unarchiver;Foo*myFoo1;AddressBook*myBook;/Readinthearchiveandconnectan/NSKeyedUnarchiverobjecttoitdataArea=NSDatadataWithContentsOfFile:myArchive;,使用NSData创建自定义档案:(cont.),if(!dataArea)NSLog(Cantreadbackarchivefile!);return(1);unarchiver=NSKeyedUnarchiverallocinitForReadingWithData:dataArea;/DecodetheobjectswepreviouslystoredinthearchivemyBook=unarchiverdecodeObjectForKey:myaddrbook;myFoo1=unarchiverdecodeObjectForKey:myfoo1;unarchiverfin
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年版某市特价房买卖合同样本
- 门卫防疫知识培训心得课件
- 激光雷达固态化技术成本控制与市场竞争力研究报告
- 门卫安全岗位培训课件
- 门卫保安消防安全培训记录课件
- 激光雷达固态化在无人机航拍领域的成本效益分析报告
- 2025年3D打印技术在器官移植中的应用
- 2025年3D打印技术在定制医疗中的应用
- 镀层知识培训内容课件
- 2025年3D打印技术的增材制造工艺
- 跨境电子商务课件2024新版
- 智慧税务知识培训课件
- 2024影视项目联合出品与剧本开发合作协议范本3篇
- DB51T 2616-2019 机关会议服务规范
- 乡村文旅规划
- 广东省普通高中学科教学水平评估指标详述
- 污水处理厂人员培训方案
- 苏教版五年级上册数学分层作业设计 5.5 小数乘小数(附答案)
- 现货黄金购买合同模板
- 学术道德与学术规范
- 《机械基础》课件-V带传动
评论
0/150
提交评论