首先得了解SandBox沙盒 本质就是一个提供给我们app的专用文件夹
我们可以获取到沙盒的path:NSString *home = NSHomeDirectory();
打印出来复制可以通过Finder-前往-前往文件夹就看可以找到在mac下该项目沙盒的位置了
各位刚接触ios的童鞋应该知道在Bundle中包含了所有的资源文件和可执行文件
在沙盒目录下我们可以看到三个文件夹Documents、
Library以及tmp,其中Library下还包含两个目录:
Documents:保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录。例如,游戏应
用可将游戏存档保存在该目录
Library/Caches:保存应用运行时生成的需要持久化的数据,iTunes同步设备时不会备份该目录。一般
存储体积较大、不需要备份的非重要数据
Library/Preference:保存应用的所有偏好设置,iOS的设置应用会在该目录中查找应用的设置信息。
iTunes同步设备时会备份该目录
tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系
统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录
实例:
#import "ViewController.h"
#import "Person.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//文件 plist
//获取沙盒path
NSMutableDictionary *dic;
//获取到沙盒路径 追加上沙盒下的documents目录 以及该目录下的一个文件
NSString *path=[NSHomeDirectory() stringByAppendingPathComponent:@"Documents/cities.plist"];
NSLog(@"%@",path);//可以看到app沙盒在mac下的位置
//判断文件是否存在
if(![[[NSFileManager alloc]init] fileExistsAtPath:path])
{
//文件不存在即从远程服务器获取 这里在本地bundle放了一个名为cities的plist文件用来获取作为示例
dic=[NSMutableDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"cities" ofType:@"plist"]];
}
else
{
//文件存在则读取
dic=[NSMutableDictionary dictionaryWithContentsOfFile:path];
}
NSLog(@"读取到的文件%@",dic);
//写入文件到沙盒 writetofile 该方法同样可用于nsstring array data等
[dic writeToFile:path atomically:YES];
//--------------------------------
//用户配置 使用NSUserDefaults
//我们可以再里面保存用户名以及密码实现保存登录状态
[[NSUserDefaults standardUserDefaults] setObject:@"abc" forKey:@"username"];
[[NSUserDefaults standardUserDefaults] setObject:@"123" forKey:@"password"];
//读取
NSString *uName=[[NSUserDefaults standardUserDefaults] objectForKey:@"username"];
//在info.plist中保存有版本信息 使用用户配置保存版本信息来核对是否第一次打开app以显示特性
//通常在AppDelegate中进行判断
//获取info中的版本信息
NSDictionary *infoDic=[[NSBundle mainBundle] infoDictionary];
NSString *str=infoDic[@"CFBundleShortVersionString"];//app版本信息
//接下来判断用户配置中是否有版本信息 如果有是否和当前app版本信息相同 如果没有或者不同则表示第一次打开该版本的app则显示特性介绍
//--------------------------------
//归档 解档
NSString *dataPath=[NSHomeDirectory() stringByAppendingPathComponent:@"Documents/info.m" ];
//通常用来将自定义存放在文件中
//这里我们定义一个Person类为例子 自定义类需要遵守NSCoding协议实现·encodeWithCoder initWithCoder两个方法
Person *p=[[Person alloc]init];
[p setName:@"Liu"];
[p setAge:15];
NSMutableData *data=[NSMutableData data];//用来存放编码后的数据
//创建一个归档器
NSKeyedArchiver *arch=[[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[arch encodeObject:p forKey:@"Person"];//将person对象编码并设置一个key
[arch finishEncoding];//需要结束编码
//写入到文件
[data writeToFile:dataPath atomically:YES];
//解档
NSKeyedUnarchiver *uarch=[[NSKeyedUnarchiver alloc]initForReadingWithData:[NSData dataWithContentsOfFile:dataPath]];
Person *per=[uarch decodeObjectForKey:@"Person"];
NSLog(@"%@----%d",per.name,per.age);
}
@end
person类 包含name和age两个属性:
#import "Person.h"
@interface Person()<NSCoding>
@end
@implementation Person
-(id)initWithCoder:(NSCoder *)aDecoder
{
if(self=[super init])
{
_name=[aDecoder decodeObjectForKey:@"name"];
_age=[[aDecoder decodeObjectForKey:@"age"] integerValue];
}
return self;
}
-(void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:_name forKey:@"name"];
[aCoder encodeObject:@(_age) forKey:@"age"];
}
@end