沙盒 归档
一、沙盒(sandbox)
1、iOS的沙盒(sandbox)机制:是一种安全体系 iOS应用程序只能对自己创建的应用程序进行读取文件 这个独立、封闭、安全的空间 就是沙盒。它里面一般存放着你的程序需要的文件 数据持久化的一些文件(Plist、sqlite...)音视频、图片以及其他资源文件
2、每一个应用程序只有一个沙盒。沙盒里面有三个文件夹
1>Documents
特点:目录下的内容 会被同步到另一台设备 可以放 媒体资源 文本资源
2>Librery
特点:可以把缓存的内容放到Library/Caches
3>tmp
特点:创建临时文件的目录 当我们的设备重启时 文件会被自动清除
3、获取沙盒文件的方式
1>获得根目录的方式
NSString *homePath = NSHomeDirectory();
NSLog(@"%@", homePath);
2>获得 Document 的方式
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *DocumentPath = [paths firstObject];
NSLog(@"%@", DocumentPath);
3>获得Library 的方式
NSArray *pathL = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *LibraryPath = [pathL lastObject];
NSLog(@"%@", LibraryPath);
4>获得Library/Caches 的方式
NSArray *pathCh = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *CachesPath = [pathCh firstObject];
NSLog(@"%@", CachesPath);
5>获得 tmp 的方式
NSString *tmpPath = NSTemporaryDirectory();
NSLog(@"%@", tmpPath);
二、归档
1、归档 NSKeyedArchiver 解文挡 NSKeyedUnarchiver
2、归档又叫序列化 coding。
3、归档之后的文件会被加密。
4、可以归档的文件、数据:任何数据(直接归档一个类实例化的对象 数组 字典 字符串 文本 图片…)。
5、使用 NSKeyedArchiver 归档
1>归档路径 需要归档的数据
2>归档、解归档
1>(1)归档在哪个文件
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath = [paths lastObject];
1>(2)拼接归档文件的路径
NSString *path = [documentPath stringByAppendingPathComponent:@“userList.archiver"];
1>(3)归档数据
NSArray *users = @[@"外星人", @"喵喵", @"汪汪"];
BOOL success = [NSKeyedArchiver archiveRootObject:users toFile:path];//users 归档数据 path 归档路径
if (success) {
NSLog(@“归档成功”);
}
6、使用 NSKeyedUnarchiver 解归档
1>解归档的文件路径
2>解归档
1>(1)解归档的文件路径
NSArray *pathU = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *pathU1 = [[pathU lastObject] stringByAppendingPathComponent:@“userList.archiver"];
1>(2)解归档
NSArray *list = [NSKeyedUnarchiver unarchiveObjectWithFile:pathU1];
//遍历归档里面的数据
for (NSString *name in list) {
NSLog(@"%@", name);
}
//添加新的元素
NSMutableArray *arr = [list mutableCopy];
[arr addObject:@“星星"];
7、使用NAData归档
NSData 二进制数据的类
1>归档文件路径 准备需要归档的数据
2>写一个可变NSMutableData 通过归档的类 让Data 准备写入文件
3>开始(归档)编码
4>结束(归档)编码 把Data数据写入到文件
1>归档文件路径 准备需要归档的数据
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
// 拼接归档文件的路径
NSString *path = [[paths lastObject] stringByAppendingPathComponent:@"userList1.archiver"];
// 归档数据
NSArray *list = @[@"111", @"222", @"333"];
NSDictionary *dic = @{@“key":@"value"};
2>写一个可变NSMutableData 通过归档的类 让Data 准备写入到文件
NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
3>开始(归档)编码(编码的key 和 解码时候的key 一定要同一)
[archiver encodeObject:list forKey:@"list"];
[archiver encodeObject:dic forKey:@"dic"];
4>结束(归档)编码 把data数据写入到文件
[archiver finishEncoding];
// atomically 如果设置成YES 的时候 在写入数据时 如果出现意外情况(用户突然强制退出了应用程序、断电...)会把写入到临时文件的内容清掉 不再写入到目标文件
// atomically 如果设置成NO 不管数据是否完整 都会直接写入到目标文件
BOOL success = [data writeToFile:path atomically:YES];
//检测是否归档成功
if (success) {
NSLog(@“归档成功”);
}
8、 解归档
1>文件路径
2>读取文件里面data数据
3>通过解归档对象 读取data数据 准备解归档
4>解归档数据
1>文件路径
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
拼接归档文件的路径
NSString *path = [[paths lastObject] stringByAppendingPathComponent:@"userList1.archiver"];
2>读取文件里面data数据
NSData *data = [NSData dataWithContentsOfFile:path];
3>通过解归档对象 读取data数据 准备解归档
NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];
4>解归档数据(解码)
NSArray *arr = [unArchiver decodeObjectForKey:@"list"];
NSDictionary *dic = [unArchiver decodeObjectForKey:@"dic"];
//输出解归档的数据
NSLog(@"%@\n%@", arr, dic);
9、归档自定义类的对象
1、想归档自定义类的对象
1>遵守NSCoding协议
2>实现归档协议里面的方法
3>逐一对 自定义类里面的属性 进行了 编码和解码
//对UserModel(自定义类)对象里面 每一个属性进行编码
- (void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeInteger:self.age forKey:@"age"];
}
//对UserModel对象 进行解码
- (id)initWithCoder:(NSCoder *)aDecoder{
if (self = [super init]) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeIntegerForKey:@"age"];
}
return self;
}
4>开始归档 解归档
2、归档
1>准备要归档的路径 要归档的数据
2>进行归档
1>准备要归档的路径 要归档的数据
1>准备要归档文件的路径
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [[paths lastObject] stringByAppendingPathComponent:@"UserModel.archiver"];
要归档的数据
UserModel *model = [[UserModel alloc]init];
model.name = @"小明";
model.age = 21;
2>进行归档
BOOL success = [NSKeyedArchiver archiveRootObject:(id) model toFile:(NSString *)path];
if (success) {
NSLog(@“归档成功”);
}
3、 解归档
1>文件路径
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [[paths lastObject] stringByAppendingPathComponent:@"UserModel.archiver"];
2>解归档
UserModel *model = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
NSLog(@"%@ %ld", model.name, (long)model.age);