IOS随笔——归档和解归档

文章参考视频  http://www.tudou.com/programs/view/ToJ3eRwCrhY/


归档在我们的开发中相对来说用的还是特别多的 ,在小型文件数据的存储中,不涉及到隐私或者有失平衡的数据的时候,大多数都用这个方法来存储文件,相对于这个方法存储文件呢,我们以前还有另外一些存储方法,比如说

NSString *String = @"写入文件";
NSString *path = @"/Users/apple/Desktop/abc/test.txt";
[str writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:&error];
    
    if(error){
        NSLog(@"写入失败:%@",[error localizedDescription]);        //[error localizedDescription]打印出主要错误信息  这个在工程中没有提示  可以再打印外面写就有提示
    }else{
        NSLog(@"写入成功");
    }
}

上面的这个NSString的写入,我们如果不通过程序,只要找到这个文件的路径并找到这个文件,我们就可以直接打开这个文件,并且可以任意写入其他数据,这个在我们程序中有时候是不希望看到的,要改变这个问题,我们就可以通过归档和接档来实现

归档有多找那个方法,具体适用那种,可以根据我们在实际使用中来决定

1.比如说我只需要归档一个比较单一的NSString的话,可以采用下面这种方法

首先我们来看看归档的写法  

-(void)save:(id)sender{
NSString *homePath = NSHomeDirectory();		
        NSString *path = [homePath stringByAppendingPathComponent:@"save.txt"]; //将文件保存到 path这个路径下,并把文件名设置为save.txt
        [NSKeyedArchiver archiveRootObject:_text.text toFile:path];
        NSLog(@"保存成功");
}

NShomeDirectory 官方的解释是:  

返回的路径,无论是用户或应用程序的主目录,这取决于平台。

在iOS系统中,主目录是应用程序的sandbox目录。在OS X,它是应用程序的的sandbox目录或当前用户的主目录(如果应用程序在沙箱)

对于文件系统实用程序的更多信息,请参阅低级别的文件管理编程主题。

在这里你如果找不到这个文件的话,你可以直接打印出这个文件路径

NSLog(@"%@",NSHomeDirectory());


在这里注意的是  上面所说的设置文件名为  save.txt  这个整体是文件名,后面的.txt 不是文件后缀,所以我们在找到save.txt 这个文件的时候,我们打不开这个文件

然后我们来看看解归档

当我们吧文件用归档的方式写入之后,要再次得到这个文件的内容,我们就通过解归档来实现

-(void)getit:(id)sender{
    NSString *homePath = NSHomeDirectory();
    NSString *path = [homePath stringByAppendingPathComponent:@"save.txt"];
    NSString *string = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
    _text.text = string;
}

这样,我们就可以通过归档和解归档来写入和读取文件了


2.如果我们要归档的内容是  name : jason   age: 20  这样的数据

考虑如下情况:
1.我们有很多不同的对象需要归档,并且对象之间可能相差很大,每次进行归档麻烦,效率也不高。
2.被归档的对象不确定有多少个。
3.希望将不同对象归档到一个文件中,易于操作。
所以,如果我们能够全部将需要归档的对象首先存放在一个空间中,然后,一次性归档。这样做,那就方便多了!

在这里就不多说了,直接贴代码
归档代码:
-(void)save:(id)sender{
    NSString *homePath = NSHomeDirectory();
    NSString *path = [homePath stringByAppendingPathComponent:@"save.txt"];
    NSMutableData *data = [NSMutableData data];  //初始化一个可变的Data
    NSKeyedArchiver *archive = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    [archive encodeObject:_text.text forKey:@"name"];
    [archive encodeObject:_text2.text forKey:@"age"];
    [archive finishEncoding];  
    [data writeToFile:path atomically:YES];
    [archive release];
}
在这个例子中,我自己写的时候,每次我需要的文件都写不进去,但是也看过别人的文档,基本思路都是这样的,不知道为什么,如果有人知道的话,给留个言啊!!
所对应的解归档就可以写成
-(void)getit:(id)sender{
    NSString *homePath = NSHomeDirectory();
    NSString *path = [homePath stringByAppendingPathComponent:@"save.txt"];
    NSData *data = [NSData dataWithContentsOfFile:path];
    NSKeyedUnarchiver *unArchive = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    _text.text = [unArchive decodeObjectForKey:@"name"];
    _text2.text = [unArchive decodeObjectForKey:@"age"];
}





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值