【iOS沉思录】iOS沙盒内存使用深入剖析
背景
沙盒存储是iOS数据持久化的一种方案,操作简单,可以将数据以NSData以及常用的NSDictionary和NSArray的组织方式(通过plist文件创建文件对象)在沙盒的Documents目录中读写更新以及删除。沙盒存储的缺点是更新比较低效,每次都要将数组或者字典读出,更新后再次写入。
问题
现在的问题是:
- 开发者通过获取沙盒Documents路径往沙盒中写数据占用内存是无限的吗?
- 同一个沙盒路径反复写入会覆盖吗?
- 可以在Documents沙盒目录下创建子目录吗?
结论
实验得出的结论如下:
- 在手机内存没有耗尽的情况下,开发者的应用可以无限制往沙盒中写入数据,消耗手机空间;
- 同一个沙盒路径重复写入会覆盖之前的文件;
- 不能够往Documents目录下创建子目录。
验证过程
1.创建验证工程
首先,创建了一个新的工程,导入需要的资源,在真机上安装好后记录应用自身占用的手机内存为291K:
然后在工程中编写代码,将一张图片写入沙盒:
- (void)viewDidLoad {[super viewDidLoad];UIImage *image = [UIImage imageNamed:@"img"];NSData *data = UIImagePNGRepresentation(image);/* 创建图片沙盒绝对路径 */NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingString:[NSString stringWithFormat:@"/test.png"]];/* 图片写入沙盒Documents目录下 */[data writeToFile:path atomically:YES];
}
运行后,观察应用占用的内存变为422K,写入的图片占用了131K:
2.验证文件覆盖
现在验证重复写入会不会覆盖,将同一个路径再次写入10次,代码如下:
for (int i = 0; i < 10; i++) {/* 创建图片沙盒绝对路径 */NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingString:[NSString stringWithFormat:@"/test.png"]];/* 图片写入沙盒Documents目录下 */[data writeToFile:path atomically:YES];}
运行后应用占用的内存没有增加,依然是422K。为了形成对比,我们每次写入将路径名字变一下,代码如下:
for (int i = 0; i < 10; i++) {/* 创建图片沙盒绝对路径 */NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingString:[NSString stringWithFormat:@"/test%i.png",i]];/* 图片写入沙盒Documents目录下 */[data writeToFile:path atomically:YES];}
每张图片占用131K,如果这里成功写入十张,应用占用的空间应为:291K + 131K * 10 =1601K,大约16M。运行后看到占用的内存确实为16M(见下图),证明之前重复写入同一个路径的确是会覆盖之前的文件的。
3.验证无限写入沙盒占用内存
测试的iphone内存为64G,这里往沙盒中连续写入10万张图片,估计空间为:131K * 100000 = 13.1G。测试代码如下:
for (int i = 0; i < 10000; i++) {/* 创建图片沙盒绝对路径 */NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingString:[NSString stringWithFormat:@"/test%i.png",i]];/* 图片写入沙盒Documents目录下 */[data writeToFile:path atomically:YES];}
程序写入了十几分钟才结束,运行完应用占用手机的内存确实为13G,证明往沙盒中写入数据占用内存是没有明确限制的。
4.验证不可创建子目录
将创建的沙盒路径在Documents目录下加一个子目录,代码如下,看是否依然可以写入:
for (int i = 0; i < 10000; i++) {/* 创建图片沙盒绝对路径 */NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingString:[NSString stringWithFormat:@"/subfolder/test%i.png",i]];/* 图片写入沙盒Documents目录下 */[data writeToFile:path atomically:YES];}
工程运行后观察Debug会话界面硬盘没有任何写入,因此不能直接在沙盒创建子目录写入数据:
【iOS沉思录】iOS沙盒内存使用深入剖析相关推荐
- 【iOS沉思录】Objective-C语言的动态性总结(编译时与运行时)
编译时与运行时 编译时: 即编译器对语言的编译阶段,编译时只是对语言进行最基本的检查报错,包括词法分析.语法分析等等,将程序代码翻译成计算机能够识别的语言(例如汇编等),编译通过并不意味着程序就可以成 ...
- IOS模拟登录之沙盒原理
IOS模拟登录之沙盒原理 info.plist 文件
- iOS 照片存储到沙盒 和读取
iOS 照片存储到沙盒 和读取 这里介绍简单的ios照片保存到沙盒,然后读取出来. 1. 照片保存到沙盒 UIImage *image=[UIImage imageNamed:@"20141 ...
- 再谈CVE-2017-7047 Triple_Fetch和iOS 10.3.2沙盒逃逸
作者:蒸米 0x00 序 Ian Beer@google发布了CVE-2017-7047Triple_Fetch的exp和writeup[1],chenliang@keenlab也发表了关于Tripl ...
- IOS数据存储 —— 1 沙盒(数据存储目录)
沙盒结构 沙盒的文件系统⽬录,如下图所示(假设应用的名称叫Layer) 1.Documents 目录 您应该将所有的应用程序数据文件写入到这个目录下. 这个目录用于存储用户数据或其它应该定期备份的信息 ...
- ios沙箱软件_iOS沙盒管理工具FHHSandBoxViewer
KeyWord:沙盒文件递归遍历.Swift里的闭包多个weak修饰.iOS使用AirDrop 操作演示.gif 平时真机开发调试App的时候想查看沙盒具体内容一般做法是连接Xcode下载整个App的 ...
- iOS打开沙盒html,ios 开发中,沙盒目录解释
在iPhone的沙箱模型有四个文件夹,分别是documents.tmp.app.library. 创建文件的时候会先创建文件的路径,方法如下: 1.Documents:这是文档目录.有关应用的所有数据 ...
- 【iOS沉思录】如何招聘一个靠谱的 iOS程序员+面试题详解
说明:面试题来源是微博@我就叫Sunny怎么了的这篇博文:<招聘一个靠谱的 iOS>,其中共55题,除第一题为纠错题外,其他54道均为简答题. 出题者简介: 孙源(sunnyxx),目前就 ...
- IOS文件管理系统:沙盒、NSFileManager、NSFileHandle、NSCoding、NSKeyedArchiver解析
什么是沙盒? 苹果为我们每个app都分配了一个固定的文件夹,我们在开发过程中可以向文件夹存入我们想要存储的数据,同时也能从这些文件夹取这些数据,但是我们不能取到其他app所存储的数据.简单说,沙盒就是 ...
最新文章
- [Node]node.js 文件操作
- 比较2个DataTable中的内容是否相同的方法
- 转!mysql 查询 distinct多个字段 注意!!
- 第一章	安装OpenResty(Nginx+Lua)开发环境
- PyQt4学习资料汇总
- Python List sort()方法
- SSM整合Druid数据库连接池
- java 生成xml乱码_jdom解决中文乱码问题 JAVA生成xml文件帮了我很大的忙
- Python学习笔记之if语句(二)
- python3.6+selenium_使用外部数据的数据驱动
- openmpi和blcr
- java udp多线程服务器_UDP服务端多线程-----
- Fluid mechanics学习笔记--NS方程
- 视频教程-ArcGIS与CASS在地籍建库中的结合应用-大数据
- 2020研究生数学建模题目
- 黑金AX7Z100 FPGA开发板移植LWIP库(二)PL端
- aspen分离膜_双膜组件强化CO_2混合气分离的研究
- 读债务危机0814-08年9月崩溃
- 机器学习_深度学习毕设题目汇总——图像分割
- 360前端校招2019笔试编程题
热门文章
- Jquery通过submitHandler 实现验证后跳转到别的页面
- 铝合金三扇推拉窗的计算机方法,13种铝合金门窗下料尺寸及计算公式收藏备用!...
- 信号与系统 Matlab 时域抽样与频域抽样
- 背包算法轻松搞定——01背包算法、部分背包算法
- Towards Robust Monocular Depth Estimation:Mixing Datasets for Zero-shot Cross-dataset Transfer——阅读阶段
- Android8.0.0-r4——Property Service的启动与初始化
- 使用GetDate提取图片上曲线的数据坐标
- Windows浏览器启动页被更改为www.hao123.com
- centOS7安装pip3
- 记录RSA加解密算法使用心得