iOS沙盒机制(sandBox)

IOS中的沙盒机制(SandBox)是一种安全体系,它规定了应用程序只能在为该应用创建的文件夹内读取文件,不可以访问其他地方的内容。所有的非代码文件都保存在这个地方,比如图片、声音、属性列表和文本文件等。

 

1.每个应用程序都在自己的沙盒内

2.不能随意跨越自己的沙盒去访问别的应用程序沙盒的内容

3.应用程序向外请求或接收数据都需要经过权限认证

查看模拟器的沙盒文件夹在Mac电脑上的存储位置,首先,这个文件夹是被隐藏的,所以要先将这些文件显示出来,打开命令行:

显示Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool true

隐藏Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool false

然后重新启动Finder,点击屏幕左上角苹果标志——强制退出——选择Finder然后点击重新启动,这个时候在重新打开Finder就可以看到被隐藏的文件了。

还有一种比较简单的办法就是直接点击Finder图标右键——前往文件夹——输入/Users/your username/Library/Application Support/iPhone Simulator/ ,然后确认就可以了。your username是你本机的用户名

 

然后按下图进入相应的文件夹,就可以到模拟器的沙盒文件目录了:

 

接着进入一个模拟器版本,我这里是5.1

 

然后可以看到Applications下面存放的就是模拟器中所装的开发的应用程序,随便进入一个后可以看到,一个沙盒中包含了四个部分,如图所示:

 

分别是.app文件,这个就是可运行的应用文件,Documents,苹 果建议将程序中创建的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录;Library,存储程序的默认设置或其它 状态信息;Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除;tmp,创建和存放临时文件的地 方。 

 
 
 
程序的主路径(HomeDirectory):以下用Applacation_Home表示,该路径包含应用程序本身、Documents、Library、tmp文件夹
 
<Application_Home>/Documents/:程序的文档路径,包含了程序可以进行读写的所有文档
 
<Application_Home>/Library/Perferences/:包含了用来设置用户偏好的文件、与Documents文件不同,不能再这里创建文件,需要通过NSUserDefault这个类来访问程序的偏好设置
 
<Application_Home>/Library/Caches/:通常把特定程序的支持文件放在这个文件夹中,程序作为缓存路径的持有者,要负责文件的添加和删除工组,这个文件夹下的文件在程序同步时不会被备份
 
<Application_Home>/tmp/:包含了需要的临时文件,在不要时需要被清除,这项工作由用户自己完成,程序退出时系统也会清除其中的文件,当文件同步时,该路径下的文件不会被备份
 
 
 
 
 
1、获取沙盒文件的主路径(NSHomeDirectory()返回类型是NSString
    NSLog(@"home = %@",NSHomeDirectory());
   
2、获取Docume 
    NSLog(@"documents = %@",[NSHomeDirectory() stringByAppendingString:@"/Documents"]);
   
2)输入路径的某一级节点(解决了斜杠问题,但文件路径还是要自己拼)
    NSLog(@"document = %@",[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]);
   
3)通过函数查找路径(第一个参数指定了要搜索的路径名称  第二个参数限制了文件的检索范围在沙盒内部  第三个参数是否展开波浪线符号  mac“~”表示主路径,例如:~/Documents  一般置为真即可)
    NSArray *files = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSLog(@"files = %@",files.lastObject);
   
3、获取临时文件(tmp)目录
    NSLog(@"%@",NSTemporaryDirectory());
   
4、(应用程序包).app 中的文件只有读取的权利,没有修改的权利
返回应用程序包的路径
    NSLog(@"%@",[[NSBundle mainBundle] bundlePath]);
返回可执行文件的路径
    NSLog(@"%@",[[NSBundle mainBundle] executablePath]);
 
 
存储练习
#pragma mark - 存储字符串对象
数据持久化过程:
1、获取存储文件的上一级路径
    NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
 
2、拼接完整的文件存储路径
    NSString *filePath = [documents stringByAppendingPathComponent:@"text.txt"];
   
3、存储数据
    NSString *saveString = @"我叫MT";
    [saveString writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil];
   
4、从文件中读取字符串对象
    NSString *readString = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
    NSLog(@"readString = %@",readString);
   
    
#pragma mark - 数组对象的读写
1、创建数组数据对象
    NSArray *nameArray = @[@"左友东",@"许珍珍",@"吴凯"];
2、获取存储文件的上一级路径
    NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
3、拼接完整的文件存储路径
    NSString *arrayFilePath = [cachesPath stringByAppendingPathComponent:@"names.plist"];
4、写入数据
    [nameArray writeToFile:arrayFilePath atomically:YES];
   
从文件中读取数组对象
    NSArray *readArray = [NSArray arrayWithContentsOfFile:arrayFilePath];
    NSLog(@"readArray = %@",readArray);
   
    
#pragma mark - 字典数据的读写
    NSDictionary *dic = @{@"name":@"maoxu",@"sex":@"demale"};
    NSString *tem = NSTemporaryDirectory();
    NSString *dicFilePath = [tem stringByAppendingPathComponent:@"dic.plist"];
    [dic writeToFile:dicFilePath atomically:YES];
   
 读取字典内容
    NSDictionary *readDic = [NSDictionary dictionaryWithContentsOfFile:dicFilePath];
    NSLog(@"readDic = %@",readDic);
   
将字典从dic.plist中读取出来,修改其中某个Value,然后重新写入dic.plist文件
    NSMutableDictionary *readDicry = [NSMutableDictionary dictionaryWithContentsOfFile:dicFilePath];
    [readDicry setObject:@"蓝鸥" forKey:@"name"];
    [readDicry writeToFile:dicFilePath atomically:YES];
    NSLog(@"readDic = %@",readDicry);
    
NSData数据读写(将图片存储到Document目录下)
    UIImage *saveImage = [UIImage imageNamed:@"heihei.jpeg"];
    NSData *saveData = UIImageJPEGRepresentation(saveImage, 1);
    NSString *imageFilesPath = [documents stringByAppendingPathComponent:@"heihei.jpeg"];
    [saveData writeToFile:imageFilesPath atomically:YES];
    
读取应用程序包中的图像,有两种方式
1、存入到缓存中,读取快但是占内存
    [UIImage imageNamed:@"heihei.jpeg"];
2、直接存到Bundle
    [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"heihei" ofType:@"jpeg"]];
    

imageNamed与imageWithContentsOfFile对于图片应用程序内存的影响,不可小视


  + (UIImage *)imageNamed:(NSString *)name方法是在application bundle的顶层文件夹寻找名字的图象 , 如果找到图片, 系统缓存图象。图片内容被加载到系统内存中,使用时直接引用到系统内存。
  所以当处理大量图片时,程序使用的内存会迅速上升导致内存警告并退出。
  特别在使用Interface Builder建立界面时,如果直接拖动UIImageView 并设置image的图片名称。InterfaceBuilder 正是通过UIImage 类的imageName方法加载图片。图片被缓存,导致内存使用较大。且无法释放,即使release掉 UIImageView也无济于事。
 
  为避免这种error,可以使用如下方法:
    NSString *path = [[NSBundle mainbundle] pathForResource:@" " ofType:@" "];
    UIImage *image = [UIImage imageWithContentsOfFile:path];
  当然,对于图片处理等相关程序,可以直接为UIImage写一个catagory,重载imageNamed方法,如下:
    @implementation UIImage(imageNamed_Hack) 
    + (UIImage *)imageNamed:(NSString *)name
     { 
      return [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/%@", [[NSBundle mainBundle] bundlePath], name ] ];
    } 
    @end
  

 

 

iOS沙盒机制(sandBox),,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。