归档&存储

归档,即把对象的状态持久保存到文件系统(数据库/网络/云平台)
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];

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值