一、简介
在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用,且必须先获取路径相对麻烦;
偏好设置(将所有的东西都保存在同一个文件夹下面,且主要用于存储应用的设置信息
归档:因为前两者都有一个致命的缺陷,只能存储常用的类型。归档可以实现把自定义的对象存放在文件中。
二、使用
#import "ViewController.h"#import "Person.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad{ [super viewDidLoad]; //1.创建对象 Person *p=[[Person alloc]init]; p.name=@"deng"; p.age=23; p.height=1.7; //2.获取文件路径 NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]; NSString *path=[docPath stringByAppendingPathComponent:@"person.deng"]; NSLog(@"path=%@",path); //3.将自定义的对象保存到文件中 [NSKeyedArchiver archiveRootObject:p toFile:path];}-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent *)event{ //1.获取文件路径 NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]; NSString *path=[docPath stringByAppendingPathComponent:@"person.deng"]; NSLog(@"path=%@",path); //2.从文件中读取对象 Person *p=[NSKeyedUnarchiver unarchiveObjectWithFile:path]; NSLog(@"%@,%d,%.1f",p.name,p.age,p.height);}@end
person.h文件
#import@interface Person : NSObject @property(nonatomic,strong)NSString *name;@property(nonatomic,assign)int age;@property(nonatomic,assign)double height;@end
person.m
#import "Person.h"@implementation Person-(void)encodeWithCoder:(NSCoder *)aCoder{ [aCoder encodeObject:self.name forKey:@"name"]; [aCoder encodeInt:self.age forKey:@"age"]; [aCoder encodeDouble:self.height forKey:@"height"];} -(id)initWithCoder:(NSCoder *)aDecoder{ if (self == [super init]) { self.name = [aDecoder decodeObjectForKey:@"name"]; self.age = [aDecoder decodeIntForKey:@"age"]; self.height = [aDecoder decodeDoubleForKey:@"height"]; } return self;}@end
三、注意
1.一定要实现协议<NSCoding>,并在要保存对象的.m文件中实现两个协议方法(如果不实现会报错):
-(void)encodeWithCoder:(NSCoder *)aCoder
-(id)initWithCoder:(NSCoder *)aDecoder
2.保存保存时对象的属性类型一定要注意,要用对应的方法保存对应的属性。
3.读取出来的数据一定要赋给对象的属性。