忘记出自哪里了:
如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,可以直接用NSKeyedArchiver进行归档和恢复
不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSCoding协议的对象才可以
NSCoding协议有2个方法:
encodeWithCoder:
每次归档对象时,都会调用这个方法。一般在这个方法里面指定如何归档对象中的每个实例变量,可以使用encodeObject:forKey:方法归档实例变量
initWithCoder:
每次从文件中恢复(解码)对象时,都会调用这个方法。一般在这个方法里面指定如何解码文件中的数据为对象的实例变量,可以使用decodeObject:forKey方法解码实例变量
归档系统自带类:
NSArray * array = [NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"5", nil];
NSString * path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString * filePath = [path stringByAppendingPathComponent:@"bbb.xx"];
[NSKeyedArchiver archiveRootObject:array toFile:filePath];
NSArray * arrays = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"dict = %@",arrays);
归档自定义类:
Others * others = [[Others alloc] init];
others.name = @"小明";
others.age = @"20";
NSString * parh = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSString * filePath = [parh stringByAppendingPathComponent:@"cccc.xxx"];
[NSKeyedArchiver archiveRootObject:others toFile:filePath];
Others * other = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"name = %@, age = %@",other.name,others.age);
Other.h
#import <Foundation/Foundation.h>
@interface Others : NSObject
@property (strong , nonatomic) NSString * name;
@property (strong , nonatomic) NSString * age;
@end
Other.m
#import "Others.h"
//NSKeyedArchiver归档如果想将一个自定义对象保存到文件中必须实现NSCoding协议
@interface Others ()<NSCoding>
@end
@implementation Others
//当从文件中读取一个对象的时候就会调用该方法
//也在该方法中说明如何读取储存在文件中的对象
- (instancetype)initWithCoder:(NSCoder *)coder
{
self = [super init];
if (self) {
self.name = [coder decodeObjectForKey:@"name"];
self.age = [coder decodeObjectForKey:@"age"];
}
return self;
}
//将一个自定义对象保存到文件的时候就会调用该方法
//也在该方法中说明如何储存自定义对象的属性
-(void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeObject:self.age forKey:@"age"];
}
@end