NSKeyedArchiver:采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和initWithCoder:方法。前一个方法告诉系统怎么对对象进行编码,而后一个方法则是告诉系统怎么对对象进行解码。
例如对Possession对象归档保存。
定义Possession:
@interface Possession:NSObject<NSCoding>{//遵守NSCoding协议
NSString *name;//待归档类型
}
@implementation Possession
-(void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:name forKey:@"name"];
}
-(void)initWithCoder:(NSCoder *)aDecoder{
name=[[aDeCoder decodeObjectforKey:@"name"] retain];
}
归档操作:
如果对Possession对象allPossession归档保存,只需要NSCoder子类NSKeyedArchiver的方法archiveRootObject:toFile: 即可。
NSString *path = [self possessionArchivePath];
[NSKeyedArchiver archiveRootObject:allPossessions toFile: path ]
解压操作:
同样调用NSCoder子类NSKeyedArchiver的方法unarchiveRootObject:toFile: 即可
allPossessions = [[NSKeyedUnarchiver unarchiveObjectWithFile:path] retain];
例如:
- NSString *str = @"abc";
- NSString *astr = @"efg";
- NSArray *Array = [NSArray arrayWithObjects:str, astr, nil];
-
- //保存数据
- NSString *Path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)
- objectAtIndex:0];
- NSString *filename = [Path stringByAppendingPathComponent:@"test.plist"];
- [NSKeyedArchiver archiveRootObject:Array toFile:filename];
-
- str = @"a";
- astr = @"";
-
- //加载数据
- NSArray *arr = [NSKeyedUnarchiver unarchiveObjectWithFile: filename];
- str = [arr objectAtIndex:0];
- astr = [arr objectAtIndex:1];
-
- NSLog(@"str:%@",str);
- NSLog(@"astr:%@",astr);
缺点:归档的形式来保存数据,只能一次性归档保存以及一次性解压。所以只能针对小量数据,而且对数据操作比较笨拙,即如果想改动数据的某一小部分,还是需要解压整个数据或者归档整个数据。