背景

沙盒存储是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沙盒内存使用深入剖析相关推荐

  1. 【iOS沉思录】Objective-C语言的动态性总结(编译时与运行时)

    编译时与运行时 编译时: 即编译器对语言的编译阶段,编译时只是对语言进行最基本的检查报错,包括词法分析.语法分析等等,将程序代码翻译成计算机能够识别的语言(例如汇编等),编译通过并不意味着程序就可以成 ...

  2. IOS模拟登录之沙盒原理

    IOS模拟登录之沙盒原理 info.plist 文件

  3. iOS 照片存储到沙盒 和读取

    iOS 照片存储到沙盒 和读取 这里介绍简单的ios照片保存到沙盒,然后读取出来. 1. 照片保存到沙盒 UIImage *image=[UIImage imageNamed:@"20141 ...

  4. 再谈CVE-2017-7047 Triple_Fetch和iOS 10.3.2沙盒逃逸

    作者:蒸米 0x00 序 Ian Beer@google发布了CVE-2017-7047Triple_Fetch的exp和writeup[1],chenliang@keenlab也发表了关于Tripl ...

  5. IOS数据存储 —— 1 沙盒(数据存储目录)

    沙盒结构 沙盒的文件系统⽬录,如下图所示(假设应用的名称叫Layer) 1.Documents 目录 您应该将所有的应用程序数据文件写入到这个目录下. 这个目录用于存储用户数据或其它应该定期备份的信息 ...

  6. ios沙箱软件_iOS沙盒管理工具FHHSandBoxViewer

    KeyWord:沙盒文件递归遍历.Swift里的闭包多个weak修饰.iOS使用AirDrop 操作演示.gif 平时真机开发调试App的时候想查看沙盒具体内容一般做法是连接Xcode下载整个App的 ...

  7. iOS打开沙盒html,ios 开发中,沙盒目录解释

    在iPhone的沙箱模型有四个文件夹,分别是documents.tmp.app.library. 创建文件的时候会先创建文件的路径,方法如下: 1.Documents:这是文档目录.有关应用的所有数据 ...

  8. 【iOS沉思录】如何招聘一个靠谱的 iOS程序员+面试题详解

    说明:面试题来源是微博@我就叫Sunny怎么了的这篇博文:<招聘一个靠谱的 iOS>,其中共55题,除第一题为纠错题外,其他54道均为简答题. 出题者简介: 孙源(sunnyxx),目前就 ...

  9. IOS文件管理系统:沙盒、NSFileManager、NSFileHandle、NSCoding、NSKeyedArchiver解析

    什么是沙盒? 苹果为我们每个app都分配了一个固定的文件夹,我们在开发过程中可以向文件夹存入我们想要存储的数据,同时也能从这些文件夹取这些数据,但是我们不能取到其他app所存储的数据.简单说,沙盒就是 ...

最新文章

  1. [Node]node.js 文件操作
  2. 比较2个DataTable中的内容是否相同的方法
  3. 转!mysql 查询 distinct多个字段 注意!!
  4. 第一章 安装OpenResty(Nginx+Lua)开发环境
  5. PyQt4学习资料汇总
  6. Python List sort()方法
  7. SSM整合Druid数据库连接池
  8. java 生成xml乱码_jdom解决中文乱码问题 JAVA生成xml文件帮了我很大的忙
  9. Python学习笔记之if语句(二)
  10. python3.6+selenium_使用外部数据的数据驱动
  11. openmpi和blcr
  12. java udp多线程服务器_UDP服务端多线程-----
  13. Fluid mechanics学习笔记--NS方程
  14. 视频教程-ArcGIS与CASS在地籍建库中的结合应用-大数据
  15. 2020研究生数学建模题目
  16. 黑金AX7Z100 FPGA开发板移植LWIP库(二)PL端
  17. aspen分离膜_双膜组件强化CO_2混合气分离的研究
  18. 读债务危机0814-08年9月崩溃
  19. 机器学习_深度学习毕设题目汇总——图像分割
  20. 360前端校招2019笔试编程题

热门文章

  1. Jquery通过submitHandler 实现验证后跳转到别的页面
  2. 铝合金三扇推拉窗的计算机方法,13种铝合金门窗下料尺寸及计算公式收藏备用!...
  3. 信号与系统 Matlab 时域抽样与频域抽样
  4. 背包算法轻松搞定——01背包算法、部分背包算法
  5. Towards Robust Monocular Depth Estimation:Mixing Datasets for Zero-shot Cross-dataset Transfer——阅读阶段
  6. Android8.0.0-r4——Property Service的启动与初始化
  7. 使用GetDate提取图片上曲线的数据坐标
  8. Windows浏览器启动页被更改为www.hao123.com
  9. centOS7安装pip3
  10. 记录RSA加解密算法使用心得