iOS沙盒机制
2016-02-25 01:17
423 查看
一、简介
每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离。
应用必须待在自己的沙盒里,其他应用不能访问该沙盒
二、应用沙盒目录
Application应用程序包:包含了所有的资源文件和和可执行文件,上架前经过数字签名,上架后不可修改
Documents:保存应用程序本身运行时产生的文件或者数据,iCloud备份目录,例如:游戏进度、涂鸦软件的绘图
注意点:不要保存从网络上下载的文件,否则会无法上架!
Library
用户偏好,使用 NSUserDefault 直接读写!
如果要想数据及时写入磁盘,还需要调用一个同步方法
保存临时文件,"后续需要使用",例如:缓存图片,离线数据(地图数据)
系统不会清理 cache 目录中的文件
就要求程序开发时,"必须提供 cache 目录的清理解决方案"
Caches:存放体积大又不需要备份的数据
Preference:保存应用的所有偏好设置,iCloud会备份设置信息
tmp:存放临时文件,不会被备份,而且这个文件下的数据有可能随时被清除的可能
保存临时文件,"后续不需要使用"
tmp 目录中的文件,系统会自动清理
重新启动手机,tmp 目录会被清空
系统磁盘空间不足时,系统也会自动清理
三、应用沙盒目录的常见获取方式
每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离。
应用必须待在自己的沙盒里,其他应用不能访问该沙盒
二、应用沙盒目录
Application应用程序包:包含了所有的资源文件和和可执行文件,上架前经过数字签名,上架后不可修改
Documents:保存应用程序本身运行时产生的文件或者数据,iCloud备份目录,例如:游戏进度、涂鸦软件的绘图
注意点:不要保存从网络上下载的文件,否则会无法上架!
Library
用户偏好,使用 NSUserDefault 直接读写!
如果要想数据及时写入磁盘,还需要调用一个同步方法
保存临时文件,"后续需要使用",例如:缓存图片,离线数据(地图数据)
系统不会清理 cache 目录中的文件
就要求程序开发时,"必须提供 cache 目录的清理解决方案"
Caches:存放体积大又不需要备份的数据
Preference:保存应用的所有偏好设置,iCloud会备份设置信息
tmp:存放临时文件,不会被备份,而且这个文件下的数据有可能随时被清除的可能
保存临时文件,"后续不需要使用"
tmp 目录中的文件,系统会自动清理
重新启动手机,tmp 目录会被清空
系统磁盘空间不足时,系统也会自动清理
三、应用沙盒目录的常见获取方式
// 沙盒根目录 NSString *homeDir = NSHomeDirectory(); NSLog(@"homeDir: %@", homeDir); // 获取tmp目录 NSString *tmpDir = NSTemporaryDirectory(); NSLog(@"tmpDir: %@", tmpDir); // NSUserDomainMask 代表从用户文件夹下找 // YES 代表展开路径中的波浪字符“~” // 在iOS中,只有一个目录跟传入的参数匹配,所以这个集合里面只有一个元素NSString*documents =[array objectAtIndex:0]; NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, NO) objectAtIndex:0]; NSLog(@"Documents: %@", documents); // 获取Documents目录 // NSSearchPathForDirectoriesInDomains(要查找的目录, 是否是用户主目录, YES/NO 是否获取全路径); NSArray *arr1 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSLog(@"Documents: %@", [arr1 lastObject]); // 获取Library目录 NSArray *arr2 = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); NSLog(@"Library: %@", [arr2 lastObject]); // 获取Library/Caches目录 NSArray *arr3 = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); NSLog(@"Caches: %@", [arr3 lastObject]); // 获取Library/Preferences目录 NSArray *arr4 = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); NSString *path = [arr4 lastObject]; path = [path stringByAppendingPathComponent:@"Preferences"]; NSLog(@"Preferences: %@", path); // 写入文件到指定的文件夹下 NSString *path2 = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, NO) objectAtIndex:0]; path2 = [path2 stringByAppendingPathComponent:@"Preferences/test.txt"]; NSString *str = @"Jacedy"; [str writeToFile:path2 atomically:YES encoding:NSUTF8StringEncoding error:nil]; // 创建目录 NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *testDir = [path2 stringByAppendingPathComponent:@"test"]; [fileManager createDirectoryAtPath:testDir withIntermediateDirectories:YES attributes:nil error:nil]; if ([fileManager fileExistsAtPath:testDir]) { NSLog(@"It is exist"); }
// 文件操作 - (void)fileManage { NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; #pragma mark - NSString写入文件 NSString *txtPath = [docPath stringByAppendingPathComponent:@"bada.txt"];// 此时仅存在路径,文件并没有真实存在 NSString *string = @"莽荒记"; [string writeToFile:txtPath atomically:YES encoding:NSUTF8StringEncoding error:nil];// 字符串写入时执行的代码 NSLog(@"%@", txtPath); #pragma mark - NSData写入文件 NSString *dataPath = [docPath stringByAppendingPathComponent:@"icon.jpg"]; UIImage *image = [UIImage imageNamed:@"640*960.jpg"]; NSData *data = UIImageJPEGRepresentation(image, 1.0); [data writeToFile:dataPath atomically:YES]; NSLog(@"dataPath: %@", dataPath); #pragma mark - 创建文件夹 NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *testDir = [docPath stringByAppendingPathComponent:@"test"]; [fileManager createDirectoryAtPath:testDir withIntermediateDirectories:YES attributes:nil error:nil]; if ([fileManager fileExistsAtPath:testDir]) { NSLog(@"It is exist"); } // 获取默认问价或者某个文件夹的大小 NSDictionary *dic = [fileManager attributesOfItemAtPath:docPath error:nil]; NSLog(@"dic: %@", dic); NSNumber *number = [dic objectForKey:NSFileSize]; NSLog(@"number: %@", number); } // 文件移动 - (void)fileMove { #pragma mark - 文件移动 // 创建文件夹 NSString *docPath1 = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; NSString *dirPath = [docPath1 stringByAppendingPathComponent:@"path"]; NSFileManager *fileManager1 = [NSFileManager defaultManager]; [fileManager1 createDirectoryAtPath:dirPath withIntermediateDirectories:YES attributes:nil error:nil]; // 创建文件 NSString *filePath = [dirPath stringByAppendingPathComponent:@"test1.txt"]; [fileManager1 createFileAtPath:filePath contents:nil attributes:nil]; // 将图片对象存入到该文件中 UIImage *image1 = [UIImage imageNamed:@"640*960.jpg"]; NSData *data1 = UIImageJPEGRepresentation(image1, 1.0); [data1 writeToFile:filePath atomically:YES]; NSLog(@"%@", filePath); // 移动文件 NSString *desPath = [docPath1 stringByAppendingPathComponent:@"test1.txt"]; [fileManager1 moveItemAtPath:filePath toPath:desPath error:nil]; } // 文件更改 - (void)changeFile { // 1.获取Documents路径 NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; // 2.创建文件路径 NSString *filePath = [docPath stringByAppendingPathComponent:@"text.txt"]; // 3.使用文件管理对象创建文件 NSFileManager *fileManager = [NSFileManager defaultManager]; [fileManager createFileAtPath:filePath contents:[@"abcdefg" dataUsingEncoding:NSUTF8StringEncoding] attributes:nil]; // 4.创建文件对接对象 NSFileHandle *handle = [NSFileHandle fileHandleForUpdatingAtPath:filePath];// 文件对象此时针对文件,可读可写 // 5.将偏移量移动到3的位置 [handle seekToFileOffset:3]; // 6.写入数据 [handle writeData:[@"1234" dataUsingEncoding:NSUTF8StringEncoding]]; // 7.执行完操作后,关闭文件 [handle closeFile]; NSLog(@"%@", filePath); }
相关文章推荐
- iOS Developer Libray (中文版)-- Defining Classes 定义类
- iOS获取设备信息与应用信息
- iOS编程中,中文字符转为拼音
- iOS 宏
- 四个月期间 我在蜂窝教育iOS培训
- 【转】iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD
- ios 下拉刷新
- ios 异步加载图片结合tableView SDWebImage
- iOS开发笔记
- iOS新的视频开发框架AVPlayerViewContoller与画中画技术
- 关于iOS上的对象映射公用方法-备
- iOS推送 再备
- iOS中定时器NSTimer的使用-备用
- 在iOS开发中使用FMDB-备用
- 蓝懿ios微博项目之发送信息
- 详解ios文件系统文件目录读写操作-备用
- iOS 摇一摇的实现-备用
- iOS绘图教程
- iOS 第三方库 - Masonry
- iOS 第三方库 - MJRefresh