【iOS沉思录】iOS沙盒内存使用深入剖析

本文通过实验验证了iOS沙盒存储的特点:应用可无限制写入数据直至设备空间耗尽,相同路径写入会发生覆盖,且无法直接创建子目录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

沙盒存储是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会话界面硬盘没有任何写入,因此不能直接在沙盒创建子目录写入数据:
这里写图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr_厚厚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值