oc 学习(归档)
2015-12-28 18:46
190 查看
归档是一个过程,用某种格式来保存一个或多个对象,以便以后还原这些对象。通常, 这个过程包括将多个对象写入文件中,以便以后读取。
属性列表归档和带键值归档
使用xml属性列表进行归档
如果对象时NSString , NSDictionary, NSArray, NSData 或者NSNumber, 可以使用writeToFile:atomically, 该方法可以使用XML属性列表的格式写出数据。
atomically 参数被设为yes表示希望首先将字典写入临时备份文件中一旦成功,将把最终数据转移到名为glossary的制定文件中。
读取
使用NSKeyedArchiver归档
要使用其创建连续的归档。连续的归档需要完全按照写入时的顺序读取归档中的数据。
写入:
以上方法并不能归档自定义类。如果要自定义类归档,则必须完成 encodeWithCoder:方法和initWithCoder:方法的实现,
encodeWithCoder: 告知归档程序如何进行归档编码initWithCoder: 每次从指定的类解码对象
属性列表归档和带键值归档
使用xml属性列表进行归档
如果对象时NSString , NSDictionary, NSArray, NSData 或者NSNumber, 可以使用writeToFile:atomically, 该方法可以使用XML属性列表的格式写出数据。
#import <Foundation/Foundation.h> #import "Fraction.h" int main(int argc, const char * argv[]) { @autoreleasepool { NSDictionary *glossary = [NSDictionary dictionaryWithObjectsAndKeys: @"A class defined so other classes can inberit form it", @"abstract class", @"To implement all the methods defined in a protocal", @"adopt", @"Storing an object for later use.", @"archiving", nil]; if ([glossary writeToFile:@"/Users/lee/Desktop/practice/learn02/glossary" atomically:YES] == NO) { NSLog(@"Save to file failed!"); } } return 0; }
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>abstract class</key> <string>A class defined so other classes can inberit form it</string> <key>adopt</key> <string>To implement all the methods defined in a protocal</string> <key>archiving</key> <string>Storing an object for later use.</string> </dict> </plist> ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ "glossary" 12L, 446C
atomically 参数被设为yes表示希望首先将字典写入临时备份文件中一旦成功,将把最终数据转移到名为glossary的制定文件中。
读取
#import <Foundation/Foundation.h> #import "Fraction.h" int main(int argc, const char * argv[]) { @autoreleasepool { NSDictionary *glossary; glossary = [NSDictionary dictionaryWithContentsOfFile:@"/Users/lee/Desktop/practice/learn02/glossary"]; for (NSString *key in glossary) { NSLog(@"%@ : %@", key, [glossary objectForKey:key]); } } return 0; }
使用NSKeyedArchiver归档
要使用其创建连续的归档。连续的归档需要完全按照写入时的顺序读取归档中的数据。
#import <Foundation/Foundation.h> #import "Fraction.h" int main(int argc, const char * argv[]) { @autoreleasepool { NSDictionary *glossary = [NSDictionary dictionaryWithObjectsAndKeys: @"A class defined so other classes can inberit form it", @"abstract class", @"To implement all the methods defined in a protocal", @"adopt", @"Storing an object for later use.", @"archiving", nil]; [NSKeyedArchiver archiveRootObject:glossary toFile:@"/Users/lee/Desktop/practice/learn02/glossary.archive"]; } return 0; }
leedeMacBook-Pro:learn02 lee$ vi glossary.archive bplist00Ô^A^B^C^D^E^F!"X$versionX$objectsY$archiverT$top^R^@^A<86> ©^G^H^U^V^W^X^Y^Z^[U$nullÓ ^K^L^P^TWNS.keysZNS.objectsV$class£^M^N^O<80>^B<80>^C<80>^D£^Q^R^S<80>^E<80>^F<80>^G<80>^HUadoptYarchiving^abstract class_^P2To implement all the methods defined in a protocal_^P Storing an object for later use._^P4A class defined so other classes can inberit form itÒ^\^]^^^_Z$classnameX$classes\NSDictionary¢^^ XNSObject_^P^ONSKeyedArchiverÑ#$Troot<80>^A^@^H^@^Q^@^Z^@#^@-^@2^@7^@A^@G^@N^@V^@a^@h^@l^@n^@p^@r^@v^@x^@z^@|^@~^@<84>^@<8e>^@<9d>^@Ò^@õ^A,^A1^A<^AE^AR^AU^A^^Ap^As^Ax^@^@^@^@^@^@^B^A^@^@^@^@^@^@^@%^@^@^@^@^@^@^@^@^@^@^@^@^@^@^Az
写入:
#import <Foundation/Foundation.h> #import "Fraction.h" int main(int argc, const char * argv[]) { @autoreleasepool { NSDictionary *glossary; glossary = [NSKeyedUnarchiver unarchiveObjectWithFile:@"/Users/lee/Desktop/practice/learn02/glossary.archive"]; for(NSString *key in glossary){ NSLog(@"%@ : %@", key, [glossary objectForKey:key]); } } return 0; }
以上方法并不能归档自定义类。如果要自定义类归档,则必须完成 encodeWithCoder:方法和initWithCoder:方法的实现,
encodeWithCoder: 告知归档程序如何进行归档编码initWithCoder: 每次从指定的类解码对象
// // main.m // learn02 // // Created by lee on 15/12/26. // Copyright © 2015年 ltybrp. All rights reserved. // #import <Foundation/Foundation.h> #import "Fraction.h" @interface AddressCard: NSObject <NSCoding> @property (copy, nonatomic) NSString *name, *email; -(void) setName:(NSString *)theName andEmail : (NSString *) theEmail; -(NSComparisonResult) compareNames :(id) element; -(void) print; -(void) assignName:(NSString *) theName andEmail :(NSString *) theEmail; @end @implementation AddressCard @synthesize name; @synthesize email; -(void) encodeWithCoder:(NSCoder *)aCoder{ // [super encodeWithCoder: aCoder]; [aCoder encodeObject:name forKey:@"AddressCardName"]; [aCoder encodeObject:email forKey:@"AddressCardEmail"]; } -(id) initWithCoder:(NSCoder *)aDecoder{ // self = [super initWithCoder: aDecoder]; name = [aDecoder decodeObjectForKey:@"AddressCardName"]; email = [aDecoder decodeObjectForKey:@"AddressCardEmail"]; return self; } -(void) assignName:(NSString *)theName andEmail:(NSString *)theEmail{ name = theName; email = theEmail; } -(void) setName:(NSString *)theName andEmail : (NSString *) theEmail{ name = theName; email = theEmail; } -(void) print{ NSLog(@"%@ : %@", self.name, self.email); } -(NSComparisonResult) compareNames:(id)element{ if ([name compare:[element name]] != NSOrderedSame) { return [name compare:[element name]]; } else return [email compare:[element email]]; } @end int main(int argc, const char * argv[]) { @autoreleasepool { AddressCard *card1 = [[AddressCard alloc]init]; AddressCard *card2 = [[AddressCard alloc]init]; AddressCard *card3 = [[AddressCard alloc]init]; NSString *name1 = @"A"; NSString *ad1 = @"4"; NSString *name2 = @"A"; NSString *ad2 = @"2"; NSString *name3 = @"B"; NSString *ad3 = @"2"; [card1 setName:name1 andEmail:ad1]; [card2 setName:name2 andEmail:ad2]; [card3 setName:name3 andEmail:ad3]; NSMutableArray *array = [NSMutableArray arrayWithObjects:card1,card2,card3, nil]; [array sortUsingComparator:^NSComparisonResult(id objc1, id objc2){ if ([[objc1 name] compare:[objc2 name]] != NSOrderedSame) { return [[objc2 name]compare:[objc2 name]]; } else return [[objc1 email]compare:[objc2 email]]; }]; // NSLog(@"%@",[array description]); if([NSKeyedArchiver archiveRootObject:array toFile:@"/Users/lee/Desktop/practice/learn02/glossary"] == NO){ NSLog(@"archiving failed"); } NSMutableArray *w_array = [[NSMutableArray alloc]init]; w_array = [NSKeyedUnarchiver unarchiveObjectWithFile:@"/Users/lee/Desktop/practice/learn02/glossary"]; for(id node in w_array){ [node print]; } } return 0; }
使用NSData创建自定义档案 // // main.m // learn02 // // Created by lee on 15/12/26. // Copyright © 2015年 ltybrp. All rights reserved. // #import <Foundation/Foundation.h> #import "Fraction.h" @interface AddressCard: NSObject <NSCoding> @property (copy, nonatomic) NSString *name, *email; -(void) setName:(NSString *)theName andEmail : (NSString *) theEmail; -(NSComparisonResult) compareNames :(id) element; -(void) print; -(void) assignName:(NSString *) theName andEmail :(NSString *) theEmail; @end @implementation AddressCard @synthesize name; @synthesize email; -(void) encodeWithCoder:(NSCoder *)aCoder{ // [super encodeWithCoder: aCoder]; [aCoder encodeObject:name forKey:@"AddressCardName"]; [aCoder encodeObject:email forKey:@"AddressCardEmail"]; } -(id) initWithCoder:(NSCoder *)aDecoder{ // self = [super initWithCoder: aDecoder]; name = [aDecoder decodeObjectForKey:@"AddressCardName"]; email = [aDecoder decodeObjectForKey:@"AddressCardEmail"]; return self; } -(void) assignName:(NSString *)theName andEmail:(NSString *)theEmail{ name = theName; email = theEmail; } -(void) setName:(NSString *)theName andEmail : (NSString *) theEmail{ name = theName; email = theEmail; } -(void) print{ NSLog(@"%@ : %@", self.name, self.email); } -(NSComparisonResult) compareNames:(id)element{ if ([name compare:[element name]] != NSOrderedSame) { return [name compare:[element name]]; } else return [email compare:[element email]]; } @end int main(int argc, const char * argv[]) { @autoreleasepool { AddressCard *card1 = [[AddressCard alloc]init]; AddressCard *card2 = [[AddressCard alloc]init]; AddressCard *card3 = [[AddressCard alloc]init]; NSString *name1 = @"A"; NSString *ad1 = @"4"; NSString *name2 = @"A"; NSString *ad2 = @"2"; NSString *name3 = @"B"; NSString *ad3 = @"2"; [card1 setName:name1 andEmail:ad1]; [card2 setName:name2 andEmail:ad2]; [card3 setName:name3 andEmail:ad3]; NSMutableArray *array = [NSMutableArray arrayWithObjects:card1,card2,card3, nil]; [array sortUsingComparator:^NSComparisonResult(id objc1, id objc2){ if ([[objc1 name] compare:[objc2 name]] != NSOrderedSame) { return [[objc2 name]compare:[objc2 name]]; } else return [[objc1 email]compare:[objc2 email]]; }]; /*编码 NSMutableData *dataArea = [NSMutableData data]; NSKeyedArchiver *archiver; int a = 100; archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:dataArea]; [archiver encodeObject:array forKey:@"AddressData"]; [archiver encodeInt:a forKey:@"Int"]; [archiver finishEncoding]; */ //解码 if([dataArea writeToFile:@"/Users/lee/Desktop/practice/learn02/glossary" atomically:YES] == NO){ NSLog(@"archiving failed"); } NSKeyedUnarchiver* unachiver=[[NSKeyedUnarchiver alloc] initForReadingWithData:dataArea]; NSMutableData *undata = [NSMutableData dataWithContentsOfFile:@"/Users/lee/Desktop/practice/learn02/glossary"]; if(!undata){ NSLog(@"Cant't read back rachive file"); } NSMutableArray *unarray = [unachiver decodeObjectForKey: @"AddressData"]; int b = [unachiver decodeIntForKey:@"Int"]; [unachiver finishDecoding]; for(id node in unarray){ [node print]; } printf("%d\n",b); } return 0; }
相关文章推荐
- php【基础学习十八】ftp
- 全站 HTTPS 来了
- Node.js JXcore 打包
- 获取NSArray的前几个元素,取数组中某个元素
- cookie的几个问题
- Remove Duplicates from Sorted List
- Node.js 多进程
- mysql user权限表
- 简单的水印制作之美图秀秀
- CoreData的简单使用
- html页面调用servlet中文乱码问题
- iOS开发中的公共方法
- 汉字编码问题(转)
- 对iOS锁的一些研究
- word或wps中mathtype在工具栏/菜单栏消失的解决方法
- Objective-c语言_计算机网络和URL(代码1)
- canvas 图片 文字 合成
- mysql 的 find_in_set,INSTR函数使用方法
- mycncart如何开启短信验证接口功能
- 生产者消费者模式浅析