iOS 沙河机制

IOS中的沙盒机制(SandBox)是一种安全体系,它规定了应用程序只能在为该应用创建的文件夹内读取文件,不可以访问其他地方的内容。所有的非代码文件都保存在这个地方,比如图片、声音、属性列表和文本文件等。
每个应用程序的沙盒分为三个部分。分别是Documents(文件文档) Library (资源)其中Library中又分为Caches(缓存)和Preferences(用户信息)tmp(临时文件)。
下面我们快来说说这几个文件都是干什么用的。Doucments是程序中创建的或在程序中浏览到的文件数据保存在该目录下。例如用户在使用该软件是下载的一些文件图片视频和音频文件都存放在该目录下,Tunes备份和恢复的时候会包括此目录。Cashes存放缓存文件,比如浏览一些网站和观看视频和播放音乐都会生成缓存文件都会存放在这里,iTunes不会备份此目录。Preferences 保存用户的一些用户设置信息,是用户设置的一些信息。tmp存放临时文件。当我们下载文件时会临时生成一个文件叫做临时文件,该临时文件就存放在这个文件夹里。下图就是一个应用程序的沙盒文件:


屏幕快照 2016-08-14 下午7.28.49.png

下面我们介绍一下怎么用代码来获取沙盒路径

FOUNDATION_EXPORT NSString *NSHomeDirectory(void);
FOUNDATION_EXPORT NSString *NSTemporaryDirectory(void);

这两个都是系统提供快捷获取到对应目录的 C 函数。分别是获取应用程序的Docunments目录和tmp目录。
除了这个系统提供了获取目录的文件夹的方法。


FOUNDATION_EXPORT NSArray<NSString *> *NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde);

这个方法有三个参数。
第一个参数是要访问的目录名。是一个枚举。可以点进去看看都有哪些值。例 NSDocumentDirectory 获取documents的路径。
参数2:在用户作用与下搜索 NSUserDomainMask
参数3: yes or no yes代表绝对路径(基本上都用绝对), no代表相对路径。(应为iOS的沙盒路径是不断变化得)。
返回的是一个数组。

NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSLog(@"%@", [pathArray firstObject]);

通过这两行代码我们就能访问一个应用程序的Documents的文件目录。
二, 文件的读写
<1> 字符串的读写


// 1> 将文字写入本地
    NSString *helloString = @"hello, I/O File";
   // 一般拼接路径时, 使用 stringByAppendingPathComponent
    NSString *writePath = [[pathArray firstObject] stringByAppendingString:@"/hello.txt"];
   NSString *writePath1 = [[pathArray firstObject] stringByAppendingPathComponent:@"hello.txt"];
    NSError *error = nil;
   BOOL isSuccess = [helloString writeToFile:writePath atomically:YES encoding:NSUTF8StringEncoding error:&error];
    if (error) {
        NSLog(@"存储失败");
    } else {
        NSLog(@"恭喜存储成功!");
    }

//2 》 读取对应得文字
    NSError *readaError = nil;
   NSString *readString = [NSString stringWithContentsOfFile:writePath encoding:NSUTF8StringEncoding error:&readaError];
    NSLog(@"%@", readString);

<2> 数组的读写

// 3> 将数组 写入本地文件
    NSArray *array = @[@"韩旭",@"王煌",@"报名里",@"国宝"];
    NSString *arrayPath = [[pathArray firstObject] stringByAppendingPathComponent:@"name.plist"];
   BOOL isArrayWriteSuccess = [array writeToFile:arrayPath atomically:YES];
    if (isArrayWriteSuccess) {
        NSLog(@"恭喜存储成功!");
    } else {
         NSLog(@"存储失败");
    }
   //4> 将数组读入
   NSArray *nameArray = [NSArray arrayWithContentsOfFile:arrayPath];
    NSLog(@"%@", nameArray);

<3> 字典的读写

//5> 字典 写入本地
  NSDictionary *nameDic = @{@"name":@"hello"};
  NSString *dictionaryPath = [[pathArray firstObject] stringByAppendingPathComponent:@"nameDic.plist"];
BOOL isDicWriteSuccess = [nameDic writeToFile:dictionaryPath atomically:YES];
  if (isDicWriteSuccess) {
      NSLog(@"恭喜存储成功!");
  } else {
       NSLog(@"存储失败");
  }
 //6》 将字典 读入
  NSDictionary *nameDictionary = [NSDictionary dictionaryWithContentsOfFile:dictionaryPath];
  NSLog(@"%@", nameDictionary);

<4> data数据的读写


// 7》 将Data 类型写入本地
  UIImage *image = [UIImage imageNamed:@"welcome_2"];
 NSData *imageData = UIImageJPEGRepresentation(image, 1);
  UIImagePNGRepresentation(image);
  NSLog(@"%@", imageData);
  NSString *dataPath = [[pathArray firstObject] stringByAppendingPathComponent:@"imageData"];
  
BOOL isimageDataWriteSuccess = [imageData writeToFile:dataPath atomically:YES];
  if (isimageDataWriteSuccess) {
      NSLog(@"恭喜存储成功!");
  } else {
      NSLog(@"存储失败");
  }
//8> NSData 类型 读入
NSData *imageNewData = [NSData dataWithContentsOfFile:dataPath];
  UIImage *fileImage =[UIImage imageWithData:imageNewData];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,204评论 30 471
  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 99,520评论 9 467
  • 1、 沙盒概念基本介绍 iOS 应用程序只能在该 app 的文件系统中读取。这个默认的 app 文件系统就是我们说...
    Laughingg阅读 2,741评论 2 10
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,868评论 18 139
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,214评论 2 33