/* IOS 沙盒(sandbox)机制 是一种安全体系 ios应用程序只能对自己创建的应用程序进行读取文件 这个独立封闭 安全的空间 就是咋们说的沙盒 它里面一般存放着你的程序需要的文件 数据持久化的一些文件(plist sqlite)音视频 图片以及其他资源文件
1.每个应用程序只有一个沙盒
2.沙盒里面有三个文件夹 :
1)Documents ->目录下地类容 会被同步到另一台设备 可以放媒体资源、文本资源
2)Library -> 可以把缓存的内容放到Library/Caches里面 3)tmp->创建临时文件目录 当我们的设备重启是 文件会被自动清除 */
/* 归档:NSKeyedArchiever
解归档:NSKeyedUnarArchiever
1.归档又叫序列化(coding)
2.归档的文件 会被加密(数据就有一定的安全性)
3.可以归档的文件、数据:任何数据(直接归档一个类、实例化的对象、数组、字典、文本、图片...)
归档的步骤:
1.归档的路径 需要归档的数据
2.归档、解归档 */
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
/*#pragma mark———获得根目录的方式—————————————————————————————————-
NSString *homePath = NSHomeDirectory();
NSLog(@"%@",homePath);
#pragma mark------ 获得Documents目录的方式
NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *DocumentPath = [paths firstObject];
NSLog(@"%@",DocumentPath);
#pragma mark------ 获取Library目录方式
NSArray *paths2 = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *LibraryPath2 = [paths2 lastObject];
NSLog(@"%@",LibraryPath2);
#pragma mark------ 获取Caches目录方式
NSArray *paths3 = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *LibraryPath3 = [paths3 lastObject];
NSLog(@"%@",LibraryPath3);
#pragma mark------ 获取Tmp目录方式
NSString *tempPath = NSTemporaryDirectory();
NSLog(@"%@",tempPath);*/
#pragma mark———第一种归档方式—————————————————————————————————-
// 一、归档
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath = [paths lastObject];
NSString *path = [documentPath stringByAppendingPathComponent:@"userList.archiver"];
NSArray *users = @[@"葫芦娃",@"喵喵",@"汪汪"];
BOOL success = [NSKeyedArchiver archiveRootObject:users toFile:path];
if (success) {
[self showAlerWithMessage:@"归档成功"];//调用一下
NSLog(@"%@",path);
}
// 二、解归档
// 1.解归档的文件路径
// 2.解归档
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [[paths lastObject]stringByAppendingPathComponent:@"userList.archiver"];
// 解归档的类
NSArray *list = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
NSMutableArray * arr = [list mutableCopy];
[arr addObject:@“悟空"];
// 遍历一下数组
for (NSString *name in arr) {
NSLog(@"%@",name);
}
#pragma mark———第二种归档方式———————————————————————————————————
// 一、创建归档
// 归档两个: 一个数组一个字典
// NSData:这是一个二进制文件的一个类
// 步骤: 1.归档的路径、准备需要归档的数据
2.写一个可变的NSMutableData的数据 通过归档的类 让NSData准备写入到文件
3.开始编码(归档 )
4.结束编码(归档) 把NSData数据写入到文件
// 1.归档的路径、准备需要归档的数据
NSArray *pathx = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *pathy = [[pathx lastObject]stringByAppendingPathComponent:@"userList1.archiver"];
NSArray *list = @[@"111",@"222",@"333"];
NSDictionary *dic = @{@"key":@"value"};
// 2.写一个可变的NSMutableData的数据 通过归档的类 让NSData准备写入到文件
NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
// 3.开始编码(归档 ) 注意:编码的key和解码的key 一定要统一
[archiver encodeObject:list forKey:@"list"];
[archiver encodeObject:dic forKey:@"dic"];
// 4.结束编码(归档) 把NSData数据写入到文件
[archiver finishEncoding];
BOOL success = [data writeToFile:pathx atomically:YES];//atomically如果设置成YES的时候 在写入数据时 如果出现意外情况(用户强制退出了应用程序、断电...)会把写入到临时文件的内容清掉 不再写入到目标文件 如果是NO 不管数据是否完整 都会直接写入到目标文件
if (success) {
[self showAlerWithMessage:@"归档成功"];
}
// 二、解归档
// 步骤:
1.文件路径
2.读取文件里面data数据
3.通过解归档对象 读取data数据 准备解归档
4.解归档数据
// 1.文件路径
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);//Document(文件) Directory(目录)
NSString *path = [[paths lastObject]stringByAppendingPathComponent:@"userList1.archiver"];
// 2.读取文件里面data数据
NSData *data = [NSData dataWithContentsOfFile:path];
// 3.通过解归档对象 读取data数据 准备解归档
NSKeyedUnarchiver *unAchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];
// 4.解归档数据(解码)
NSArray *arr = [unAchiver decodeObjectForKey:@"list"];//返回值是一个id类型 decode(破译)
NSDictionary *dic = [unAchiver decodeObjectForKey:@"dic"];
// NSLog(@"\n%@ \n %@",arr,dic);
#pragma mark——— 第三种归档方式————————————————————————————————-
// 一、 创建归档
//想归档 自定义的对象:1.遵守NSCoding协议 2. 实现归档协议里面的方法 3.逐一对 自定义类里面的属性编码和解码 这时候就具备了 归档、解归档的功能 4.归档 解归档
// 归档:
// 1.准备要归档文件的路径 要归档的数据
// 2.进行归档
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [[paths lastObject]stringByAppendingPathComponent:@"userList1.archiver"];
UserModel *model = [[UserModel alloc]init];
model.name = @"葫芦娃";
model.age =18;
BOOL success = [NSKeyedArchiver archiveRootObject:model toFile:path];
if(success)
{
[self showAlerWithMessage:@"归档成功"];
}
//二、解归档
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [[paths lastObject]stringByAppendingPathComponent:@"userList1.archiver"];
UserModel *model = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
NSLog(@"%@ %ld",model.name,model.age);
return YES;
}
- (void)showAlerWithMessage:(NSString *)message
{
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:nil message:message delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
}