归档,即把对象的状态持久保存到文件系统(数据库/网络/云平台)
Person *p1 = [[Person alloc] init];
NSLog(@”p1 存在…”);
p1.pid = 1;
p1.name = @”Nick”;
p1.age = 20;
NSLog(@”p1不存在…”);
实现方式 一
plist–属性列表(XML也是)
NSString NSData(二进制) NSArray NSDictionary NSNumber…
NSString *str = @”Hello World!”;
NSString *path = @”/tmp/test_str.txt”;
BOOL r = [str writeToFile:path atomically :YES encoding
NSUTF8StringEncoding error:nil];
//atomically :YES 是否会产生临时文件
NSLog(@”%d”,r);
str = [NSString stringWithContentOfFile:path encoding:NSUTF8StringEncoding error:nil];
实现方式二: NSKeyedArchiver/NSKeyedUnarchiver
以键值对的方式归档对象,这种方式归档的对象每个属性都用一个键来标记,这样就可以”随机”读取内容,而不是按照写入的顺序来读取。
//这两个类继承自NSCoder
NSKeyedArchiver *a;
NSKeyedUnarchiver *ua;
- (NSData *)archivedDataWithRootObject: (id)rootObject;
- (BOOL)archiveRootObject:(id)rootObject toFile:(NSString *)path;
NSString *str = @”Hello xiao shi”;
NSString *path = @”/tmp/test_str.data”;
BOOL r = [NSKeyedArchiver archiveRootObject:str toFile:path];
str = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
NSLog(@”%@”, str);
若对象为字典
NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithCapacity:5];
[dic setObject:@”one” forKey:@”1”];
[dic setObject:@”two” forKey:@”2”];
[dic setObject:@”three” forKey:@”3”];
[dic setObject:@”four” forKey:@”4”];
实现方式四
归档自定义类型
如果要归档的对象是自定义类型,那么需要实现NSCoding协议,并实现两个核心方法:
(void)encodingWithCoder:(NSCoder *)aCoder;
(id)initWithCoder:(NSCoder *)aDecoder;
For:
Person p1 = [[Person alloc] init];
p1.pid = 1;
p1.name = @”xiao shi”;
p1.age = 20;
NSCoder 编码器(encode decode)
@interface Person:Object
#define PID @”pid”
#define NAME @”name”
#define AGE @”age”
-(void)encodingWithCoder:(NSCoder *)aCoder
{
[aCoder encodeInt:self.pid forKey:PID];
[aCoder encodeObject:self.name forKey:NAME];
[aCoder encodeInt:self.age forKey:AGE];
}
-(id)initWithCoder:(NSCoder *)aDecoder
{
self.pid = [aDecoder decodeIntForKey:PID];
self.name = [aDecoder decodeObjectForKey:NAME];
self.age = [aDecoder decodeIntForKey:AGE];
return self;
}
Then:
[NSKeyedArchiver archiveRootObject:p1 toFile:@”/tmp/1.txt”];
p1 = [NSKeyedUnarchiver unarchiveObjectWithFile:@”/tmp/1.txt”];
NSLog(@”p1.name = %@”, p1.name);
五 利用归档实现深复制
NSMutableString *s1 = [NSMutableString stringWithString:@”a”];
NSMutableString *s2 = [NSMutableString stringWithString:@”b”];
NSMutableString *s3 = [NSMutableString stringWithString:@”c”];
NSMutableArray *array = [NSMutableArray arrayWithCapacity:5];
[array addObject:s1];
[array addObject:s2];
[array addObject:s3];
NSMutableArray *array2 = [array mutableCopy];
[array2 removeAllObjects];
for(NSMutableString *s in array)
{
NSMutableString *temp = [s mutableCopy];
[array2 addObject:temp];
} //效率太低
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array];
NSMutableArray *array2 = [NSKeyedUnarchiver unarchiveObjectWithData:data];