数据的读取——沙盒模型
一、简介
iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被称为沙盒
所有的非代码文件都要保存在此,例如图像、图标、声音、映像、属性列表、文本文件等
–1) 每个应用程序都有自己的存储空间
–2) 应用程序不能翻过自己的围墙去访问别的存储空间中的内容
–3) 应用程序请求的数据都要通过权限检测,假如不符合条件,不会被放行
二、示意图
三、沙盒目录
1.模拟器的目录
2.真机的目录
四、结构分析
1. 应用程序包(Bundle)
包含了所有的资源文件和可执行文件
2.Documents
保存应用运行时生成的 需要持久化的数据,iTunes同步设备时 会备份 该目录。例如,游戏应用可将游戏存档保存在该目录
3.Library/Caches
保存应用运行时生成的 需要持久化的数据 ,iTunes同步设备时 不会备份 该目录。 一般存储体积较大、不需要备份的非重要数据
4.Library/Preference
保存应用的所有偏好设置,iOS的设置应用会在该目录中查找应用的设置信息。iTunes同步设备时 会备份 该目录
5.tmp
保存应用运行时所需的 临时数据 ,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时 不会备份 该目录
五、常用获取方式
1.获取程序的Home目录
NSString * homeStr = NSHomeDirectory();
2.获取Documents目录
//2.获取Documents目录
// 1) 要搜索的目录类型,枚举 需要使用 NSDocumentDirectory 来搜索文档目录
// 2) 要搜索的目录所在范围,通常是用户目录范围 NSUserDomainMask
// 3) 是否展开波浪号?通常使用YES
NSArray * document = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString * docmentStr = document[0];
3.获取Caches目录
NSArray * caches = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString * cachesStr = caches[0];
4.获取Preferences目录
获取Preference目录 通过NSUserDefaults类存取该目录下的设置信息
5.获取tmp目录
NSString * tmpStr = NSHomeDirectory();
6.注意
- 如果做数据存取方面的开发,测试工作最好在模拟器上先完成。
因为模拟器上测试数据相对比较好查看。待所有测试工作告一段落之后,再在真机上进行测试。 - 在iPhone开发中,如果做文件的读写操作,通常是没有错误提示的。
如果向一个不存在的文件夹中写文件,读写文件的方法会正常执行,并且不会报错,但是,文件不会写入!
7.路径
模拟器目录
/Users/qiwenming/Library/Developer/CoreSimulator/Devices/493ED8EA-93A2-4977-BC60-4E0BEBD637B5/data/Containers/Data/Application/AB82E409-0827-4B5A-BA61-65F8E188C8A4
========Documents目录==========
/Users/qiwenming/Library/Developer/CoreSimulator/Devices/493ED8EA-93A2-4977-BC60-4E0BEBD637B5/data/Containers/Data/Application/AB82E409-0827-4B5A-BA61-65F8E188C8A4/Documents
========Caches目录==========
/Users/qiwenming/Library/Developer/CoreSimulator/Devices/493ED8EA-93A2-4977-BC60-4E0BEBD637B5/data/Containers/Data/Application/AB82E409-0827-4B5A-BA61-65F8E188C8A4/Library/Caches
========tmp目录==========
/Users/qiwenming/Library/Developer/CoreSimulator/Devices/493ED8EA-93A2-4977-BC60-4E0BEBD637B5/data/Containers/Data/Application/AB82E409-0827-4B5A-BA61-65F8E188C8A4
真机Home目录:
/var/mobile/Applications/304D8530-98CB-4043-A208-EBF06E8ADBB9
六、目录实例
//
// ViewController.m
// 03_UIView25_沙盒模型
//
// Created by 杞文明 on 2016/01/07 22:47:19 星期四
// Copyright © 2016年 杞文明. All rights reserved.
//375 667
#import "ViewController.h"
@interface ViewController (){
UITextView * _textView;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self creatButton];
[self createTextView];
}
#pragma mark - 创建按钮
-(void)creatButton{
//1.实例化
UIButton * button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
//2.设置大小
[button setFrame:CGRectMake(85, 600, 200, 40)];
//3.设置文字
[button setTitle:@"获取沙盒的地址看看" forState:UIControlStateNormal];
//4.设置监听
[button addTarget:self action:@selector(clickButton:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
}
#pragma mark - 创建文本控件
-(void)createTextView{
//1.实例化
UITextView * textView = [[UITextView alloc]initWithFrame:CGRectMake(0, 0, 375, 550)];
//2.设置背景
[textView setBackgroundColor:[UIColor colorWithWhite:0 alpha:0.2]];
//3.禁止编辑
[textView setEditable:NO];
//4.允许数据监听
[textView setDataDetectorTypes:UIDataDetectorTypeAll];
//5.添加到view
[self.view addSubview:textView];
_textView = textView;
}
#pragma mark - 点击按钮的监听
-(void)clickButton:(UIButton*)button{
//1.获取程序主目录
NSString * homeStr = NSHomeDirectory();
homeStr = [NSString stringWithFormat:@"\n\n========主目录==========\n%@",homeStr];
NSLog(@"%@",homeStr);
[self appendText:homeStr];
//2.获取Documents目录
// 1) 要搜索的目录类型,枚举 需要使用 NSDocumentDirectory 来搜索文档目录
// 2) 要搜索的目录所在范围,通常是用户目录范围 NSUserDomainMask
// 3) 是否展开波浪号?通常使用YES
NSArray * document = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString * docmentStr = document[0];
docmentStr = [NSString stringWithFormat:@"\n\n========Documents目录==========\n%@",docmentStr];
NSLog(@"%@",docmentStr);
[self appendText:docmentStr];
//3.获取Caches目录
NSArray * caches = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString * cachesStr = caches[0];
cachesStr = [NSString stringWithFormat:@"\n\n========Caches目录==========\n%@",cachesStr];
NSLog(@"%@",cachesStr);
[self appendText:cachesStr];
//4.获取Preference目录 通过NSUserDefaults类存取该目录下的设置信息
//5.获取tmp目录
NSString * tmpStr = NSHomeDirectory();
homeStr = [NSString stringWithFormat:@"\n\n========tmp目录==========\n%@",tmpStr];
NSLog(@"%@",tmpStr);
[self appendText:tmpStr];
}
#pragma mark - 追加文本的方法
-(void)appendText:(NSString*)text{
//1.获取textview中已经存在的文本
NSMutableString * contentStrM = [NSMutableString stringWithString:_textView.text];
//2.把传递进来的文本,添加到上一步获取的文本后面
[contentStrM appendString:text];
//3.把组装好的文本,设置到textview中
[_textView setText:contentStrM];
//4.让textview的视图滚动到文本的结尾
NSRange range = NSMakeRange(contentStrM.length, 0);
[_textView scrollRangeToVisible:range];
}
@end