1、沙盒机制的介绍
iOS中的沙盒机制(SandBox)是一种安全体系,它规定了应用程序只能在为该应用创建的文件夹内读取文件,不可以访问其他地方的内容,所有的非代码文件都保存在这个地方,比如图片、声音、属性列表和文本文件等
其特点总结如下
2、沙盒机制的沙盒目录
3、沙盒机制的沙盒结构
4、沙盒机制的路径
① 获取沙盒路径
NSString *path = NSHomeDirectory();
NSLog(@"%@",path);
② 获取bundle路经
NSString *bundlePath = [NSBundle mainBundle].bundlePath;
NSLog(@"%@",bundlePath);
③ 获取Documents路径
NSString *documentPath = nil;
//第一种方式
documentPath = [NSHomeDirectory() stringByAppendingString:@"/Documents"];
//第二种方式
documentPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
//第三种方式
//Domains:领域,表示在用户的领域中找到Document路经
documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, NO) lastObject];
这里的第三种方式中参数三的YES和NO表示是否使用”~”代替根目录,我们可以通过打印结果看出区别
//YES:展开根目录
/Users/handsomexu/Library/Developer/CoreSimulator/Devices/CF6CF69B-8BF6-4394-BBF8-5D2C087038EF/data/Containers/Data/Application/FE1B9DEB-FC89-4398-A08A-108951F2672B/Documents
//NO:不展开根目录
~/Documents
④ 获取caches目录
NSString *cache = nil;
cache = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
⑤ 获取tmp目录
NSString *tem = NSTemporaryDirectory();
数据存储方式有三种
- Plist
- Perference
- 归档和反归档
Plist文件通常用于储存用户设置,也可以存储必要的数据,相当于一个小数据库,但是不能存储对象
1、Plist存储
//创建数据,结尾必须要有一个nil参数,否则会报错
NSArray *arr = [NSArray arrayWithObjects:@"hensen",@"java", nil];
//创建路径
NSString *savePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]stringByAppendingPathComponent:@"data.plist"];
//写进文件
[arr writeToFile:savePath atomically:YES];
2、Plist读取
//创建路径
NSString *savePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]stringByAppendingPathComponent:@"data.plist"];
//获取数据
NSArray *getArr = [NSArray arrayWithContentsOfFile:savePath];
NSString *myName = getArr [0];
NSString *myLaugage = getArr [1];
NSLog(@"name:%@,laugage:%@",myName,myLaugage);
保存应用的所有偏好设置,该目录由系统管理,无需我们来管理,系统也为我们提供了API,但是不能存储对象
1、设置Perference
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setInteger:18 forKey:@"age"];
[defaults setObject:@"hensen" forKey:@"name"];
//同步,否则数据不会保存
[defaults synchronize];
2、获取Perference
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSInteger *age = [defaults integerForKey:@"age"];
NSString *name = [defaults objectForKey:@"name"];
归档和反归档其实就是序列化和反序列化,为了弥补Plist,Perference的不能存储对象的缺点,归档和反归档遵循NSCoding协议
1、准备工作
① 创建Model
#import <Foundation/Foundation.h>
@interface PersonModel : NSObject
@property(strong,nonatomic)NSString *name;
@property(assign,nonatomic)NSInteger age;
@end
② 遵循NSCoding协议
#import "PersonModel.h"
@interface PersonModel()<NSCoding>
@end
③ 实现NSCoding方法
//NSCoding的委托方法
-(instancetype)initWithCoder:(NSCoder *)aDecoder{
if(self = [super init]){
//存储对象
self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeIntegerForKey:@"age"];
}
return self;
}
2、归档
//创建路径
NSString *filePath =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
//创建文件
NSString *fileName = [filePath stringByAppendingPathComponent:@"con.plist"];
PersonModel *model = [[PersonModel alloc]init];
model.name = @"hensen";
model.age = 18;
//归档
[NSKeyedArchiver archiveRootObject:model toFile:fileName];
反归档其实就是和归档做相反的操作,相当于装包和解包一个道理
1、准备工作
① 创建Model、遵循NSCoding协议
同上
② 实现NSCoding方法
-(void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeInteger:(self.age) forKey:@"age"];
}
2、反归档
//创建路径
NSString *filePath =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
//创建文件
NSString *fileName = [filePath stringByAppendingPathComponent:@"con.plist"];
//反归档
PersonModel *person = [NSKeyedUnarchiver unarchiveObjectWithFile:fileName];
NSLog(@"name:%@,age:%ld",person.name,(long)person.age);
源码下载