iOS 沙盒机制

  • 沙盒机制:是一种安全体系的表现,我们开发的每一个应用程序,都会有一个对应的沙盒文件夹,当前程序只能在自己的沙盒文件中读取文件,不能访问其他应用程序的沙盒,一般存储的是非代码的资源(例如:图片,视频,声音).....iOS8之后开辟一些空间可以供其他应用程序访问.
    在程序中动态生成的或者是从网络上请求下来的资源,如果存储的话,也是要存储在沙盒文件中.

    NSString *homePath = NSHomeDirectory();

沙盒文件1:Documents

Document文件作用:苹果建议将程序中建立的或者在程序中浏览的文件数据保存在该目录下,itunes备份和回复的时候也会包含此目录

  • 三个参数:
 *
 *  @param NSDocumentDirectory 它是一个枚举值,枚举你具体要查看的文件夹[要进入哪个文件夹直接修改其枚举值就可以]
 *  @param NSUserDomainMask    表示用户主目录
 *  @param YES                 一般设置为YES表示展示完整路径
 *
 

 NSString *document = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];

沙盒文件2:library

    • 存储程序默认设置,或者是其他状态信息,里边包含两个文件夹caches,Preferences
    • caches:缓存文件,会将app缓存的一些数据,例如音频,视频等文件存放其中,(不会被itunes同步)
    • Preferences:偏好设置文件夹,会将app的偏好设置存放在这个文件夹中,比如说:是否允许访问图片,是否允许访问地理位置......

    NSString *library = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];

2.1:获取Library/Caches目录

NSString *paths = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSLog(@"%@",paths);
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];

2.2:获取Library/Preferences目录

    NSArray *path2 = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
   //stringByAppendingPathComponent:就是将前面路径格式和后面的普通字符串格式连接在一起,并且以路径格式返回.
NSString *path1 = [[path2 objectAtIndex:0] stringByAppendingPathComponent:@"Preferences"];
 NSLog(@"----%@",path1);

沙盒文件3:tmp

  • tmp临时文件夹,里面放着的是app获取到的一些临时文件夹.例如:当需要展示图片时,在临时文件中先过滤,一旦展示到界面时,就会将临时文件中的数据清除. 关闭程序时,会自动清除临时文件中的数据.
  • 由于是临时文件,所以不会被itunes同步备份.
 NSString *tmpPath = NSTemporaryDirectory();
 NSLog(@"%@",tmpPath);
     //获取xxxx.app文件地址
    NSString *appPath = [[NSBundle  mainBundle] resourcePath];
    NSLog(@"%@",appPath);

将NSArray类型的数据存储到本地

#pragma mark ---  将NSArray类型的数据存储到本地
    //1:找到Documents文件夹
    NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    //2:创建需要存储的数组
    NSArray *array = @[@"小明",@"小丽",@"小花",@"小强",@"小红"];
    //3:创建数组存储的最终路径
    NSString *arrayPath = [documentsPath stringByAppendingPathComponent:@"BJS.plist"];
    //4:写入本地
    [array writeToFile:arrayPath atomically:YES];
    
    NSLog(@"arrayPath = %@",arrayPath);
    
    //将存在本地的数据取出
    NSArray *newArray = [NSArray arrayWithContentsOfFile:arrayPath];
    NSLog(@"newArray = %@",newArray);
    

将字典类型的数据存储到本地

#pragma mark ----  将字典类型的数据存储到本地
    //找到文件路径
    NSString *documentPath= [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
    //创建存储字典的文件夹
    NSDictionary *dictionary = @{@"name":@"小丽",@"gender":@"未知",@"age":@"18"};
    //最终存入的路径
    NSString *dicPath = [documentPath stringByAppendingString:@"/wj.plist"];
    //写入:
    [dictionary writeToFile:dicPath atomically:YES];
    NSLog(@"dicPath = %@",dicPath);
    
    //读取:
    NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:dicPath];
    NSLog(@"dic = %@",dic);

将NSData类型的数据存储到本地(以图片为例)

  • 常用两种初始化image的方式:
  • 1:使用imageNamed:第一次读取的时候,会先把这个图片放到缓存当中,下次在使用到这个同名的图片时,直接从缓存中读取.
    有点:方便快捷,只有第一次使用的时候稍慢,接下来在使用就会快些.
    缺点:如果在当前工程中大量会大量的浪费内存空间
    UIImage *image = [UIImage imageNamed:@"v_red_heart_selected@3x"];//这种初始化方法可以直接不给出图片的具体名字,它会自动匹配
  • 2:使用initWithContentsOfFile:初始化图片时,每次都会根据路径去读取,不会占用内存,如果图片在当前工程中只使用一次,应该选择这个方法.
#pragma  mark ---  将NSData类型的数据存储到本地(以图片为例)
   NSString *filePath = [[NSBundle mainBundle] pathForResource:@"v_red_heart_selected@3x.png" ofType:nil];//这种必须拼接图片的全名称,否则image路径为空
   UIImage *image = [[UIImage alloc] initWithContentsOfFile:filePath];
   
   //将image类型的对象转换成为NSData类型数据进行存储
   //使用UIImageJPEGRepresentation:将图片转换成为NSData类型
   //第一个参数:要转换的image对象
   //第二个参数:表示图片压缩的值
   //IPhone中将大于2M的图片,使用该方法,最终会将图片保存成jpeg格式
   NSData *imageData = UIImageJPEGRepresentation(image, 1);
   //找到路径存储
   NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
   //最终路径
   NSString *imagePath = [documentPath stringByAppendingString:@"/1234.jpeg"];
   
   [imageData writeToFile:imagePath atomically:YES];
   
   NSLog(@"imagePath = %@",imagePath);
   
   //读取NSData类型的数据
   //需求:将NSData类型的数据读取出来,转换成为UIImage类型并且显示在imageView上
   NSData *newData = [NSData dataWithContentsOfFile:imagePath];
   UIImage *showImage = [[UIImage alloc] initWithData:newData];
   UIImageView *showImageView = [[UIImageView alloc] initWithImage:showImage];
   [self.view addSubview:showImageView];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言:突然想学习一下,沙盒,看了那么多博客,我四处的搜集一下总结一下,为了以后方便学习,留存一篇整合的文章。 一、...
    麦穗0615阅读 12,377评论 5 28
  • 沙盒机制 出于安全考虑,iPhone对于安装在上面的应用程序有所限制,这个限制就是应用程序只能在为该改程序创建的文...
    Joker_King阅读 13,272评论 1 15
  • iOS为每个应用提供了独立的文件空间,一个应用只能直接访问本应用分配的文件目录,不可以访问其他目录,每个应用自己独...
    kamto阅读 1,088评论 0 4
  • iOS沙盒机制 沙盒机制 不好意思,我又一次来到了你们的世界,其实我是拒绝的,但是我的无法忍受内心的躁动!额我TM...
    iOSDevVicky阅读 2,020评论 0 12
  • iOS开发之沙盒机制(SandBox)详细讲解了沙盒的一些机制。在开发中,我们需要对沙盒进行操作,所以我们需要获取...
    小灬博阅读 3,820评论 1 4