oc 学习(归档)
来源:互联网 发布:coc武神升级数据 编辑:程序博客网 时间:2024/04/30 17:00
归档是一个过程,用某种格式来保存一个或多个对象,以便以后还原这些对象。通常, 这个过程包括将多个对象写入文件中,以便以后读取。
属性列表归档和带键值归档
使用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.archivebplist00Ô^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]];}@endint 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]];}@endint 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;}
0 0
- oc 学习(归档)
- 【补遗】- OC学习小窍门及文件操作(归档)
- OC学习之XML属性列表归档
- OC学习之NSKeyedArchiver类归档
- OC学习篇之---归档和解挡
- OC学习篇之---归档和解挡
- OC学习--归档与解档
- OC学习篇之---归档和解挡
- OC学习篇之---归档和解挡
- OC学习篇之---归档和解挡
- Snail—OC学习之本地数据持久化(归档)
- 【OC学习-28】自定义对象的归档和解归档:例子说明以及简单总结
- OC之归档
- OC之自定义归档
- oc基础知识5:归档
- OC-归档:json/plist
- OC对象归档
- OC基础17:归档
- OC语言 Fundation快速框架搜索
- iOS开发中的公共方法
- php【基础学习十八】ftp
- cookie的几个问题
- Node.js 多进程
- oc 学习(归档)
- scala _的用法
- 最全的常用正则表达式大全
- 获取NSArray的前几个元素,取数组中某个元素
- 全站 HTTPS 来了
- 如何在mycncart设置阿里云免费企业邮箱的SMTP邮件发送
- Node.js JXcore 打包
- Android Studio使用指南
- SVD在推荐系统中的应用【推荐】