ViewController.m文件
- (void)viewDidLoad { [super viewDidLoad]; NSLog(@"%@",NSHomeDirectory()); NSData *data = [NSData dataWithContentsOfFile:[NSHomeDirectory() stringByAppendingPathComponent:@"Documents/peopleFile.plist"]]; //NSKeyedUnarchiver解码器,能够把二进制数据解码为对象。 People *p = [NSKeyedUnarchiver unarchiveObjectWithData:data]; NSLog(@"%@",p); } - (IBAction)savePeopleClick:(UIButton *)sender { People *p1 = [[People alloc] init]; p1.name = @"张三"; p1.age = 34; p1.sex = YES; //NSUserDefaults中只能存储系统自带的数据类 //[[NSUserDefaults standardUserDefaults] setObject:p1 forKey:@"people"]; //只有数组中存储的对象是系统自带的数据类(NSString,NSArray,NSNumber,NSDate)时,数组才可以writoFile. // NSArray *array = [NSArray arrayWithObject:p1]; // NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/arrayFile.plist"]; // if ([array writeToFile:path atomically:NO]) { // NSLog(@"存储成功"); // }else { // NSLog(@"存储失败"); // } //NSData数据类,表示一段二进制数据。 //对于自定义的类,要想存入文件,必须把对象转换为二进制数据。就必须实现NSCoding协议。(对象序列化) //NSKeyedArchiver,编码器,能够把一个对象转换为二进制数据(前提是这个对象实现了NSCoding协议) NSData *data = [NSKeyedArchiver archivedDataWithRootObject:p1]; //二进制数据可以直接写入文件 [data writeToFile:[NSHomeDirectory() stringByAppendingPathComponent:@"Documents/peopleFile.plist"] atomically:NO]; }People.h
//只有声明并实现了NSCoding的类才能被转换为二进制数据。 @interface People : NSObject<NSCoding> @property (nonatomic,copy)NSString *name; @property (nonatomic,assign)NSInteger age; @property (nonatomic,assign)BOOL sex;
- (void)dealloc{ //[_name release]; self.name = nil; [super dealloc]; } //编码方法,方法中要把需要编码的属性进行编码。 - (void)encodeWithCoder:(NSCoder *)aCoder{ [aCoder encodeObject:_name forKey:@"name"]; [aCoder encodeInteger:_age forKey:@"age"]; [aCoder encodeBool:_sex forKey:@"sex"]; } //解码方法,把每个属性进行解码 - (id)initWithCoder:(NSCoder *)aDecoder{ self = [super init]; if (self) { //self.name = [aDecoder decodeObjectForKey:@"name"]; _name = [[aDecoder decodeObjectForKey:@"name"] copy]; _age = [aDecoder decodeIntegerForKey:@"age"]; _sex = [aDecoder decodeBoolForKey:@"sex"]; } return self; } - (NSString *)description{ return [NSString stringWithFormat:@"%@,%lu,%@",_name,_age,_sex?@"男":@"女"]; }