#.背景
沙盒存储是iOS数据持久化的一种方案,操作简单,可以将数据以NSData以及常用的NSDictionary和NSArray的组织方式(通过plist文件创建文件对象)在沙盒的Documents目录中读写更新以及删除。沙盒存储的缺点是更新比较低效,每次都要将数组或者字典读出,更新后再次写入。
#.问题
现在的问题是:
开发者通过获取沙盒Documents路径往沙盒中写数据占用空间是无限的吗?
同一个沙盒路径反复写入会覆盖吗?
可以在Documents沙盒目录下创建子目录吗?
#.结论
在手机空间没有耗尽的情况下,开发者的应用可以无限制往沙盒中写入数据,消耗手机空间;
同一个沙盒路径重复写入会覆盖之前的文件;
不能够往Documents目录下创建子目录
#.验证过程
首先,创建了一个新的工程,导入需要的资源,在真机上安装好后记录应用自身占用的手机空间为291K.
然后在工程中编写代码,将一张图片写入沙盒:
-(void)viewDidLoad{[superviewDidLoad];UIImage*image=[UIImageimageNamed:@"img"];NSData*data=UIImagePNGRepresentation(image);/* 创建图片沙盒绝对路径 */NSString*path=[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject]stringByAppendingString:[NSStringstringWithFormat:@"/test.png"]];/* 图片写入沙盒Documents目录下 */[datawriteToFile:pathatomically:YES];}
运行后,观察应用占用的空间变为422K,写入的图片占用了131K:
# 2.验证文件覆盖
现在验证重复写入会不会覆盖,将同一个路径再次写入10次,代码如下:
for(inti=0;i<10;i++){/* 创建图片沙盒绝对路径 */NSString*path=[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject]stringByAppendingString:[NSStringstringWithFormat:@"/test.png"]];/* 图片写入沙盒Documents目录下 */[datawriteToFile:pathatomically:YES];}
运行后应用占用的空间没有增加,依然是422K。为了形成对比,我们每次写入将路径名字变一下,代码如下:
for(inti=0;i<10;i++){/* 创建图片沙盒绝对路径 */NSString*path=[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject]stringByAppendingString:[NSStringstringWithFormat:@"/test%i.png",i]];/* 图片写入沙盒Documents目录下 */[datawriteToFile:pathatomically:YES];}
每张图片占用131K,如果这里成功写入十张,应用占用的空间应为:291K + 131K * 10 =1601K,大约16M。运行后看到占用的空间确实为16M(见下图),证明之前重复写入同一个路径的确是会覆盖之前的文件的。
#3.验证无限写入沙盒占用空间
测试的iphone存储空间为64G,这里往沙盒中连续写入10万张图片,估计占用空间为:131K * 100000 = 13.1G。测试代码如下:
for(inti=0;i<100000;i++){/* 创建图片沙盒绝对路径 */NSString*path=[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject]stringByAppendingString:[NSStringstringWithFormat:@"/test%i.png",i]];/* 图片写入沙盒Documents目录下 */[datawriteToFile:pathatomically:YES];}
程序写入了十几分钟才结束,运行完应用占用手机的空间确实为13G,证明往沙盒中写入数据占用空间是没有明确限制的。
#4.验证不可创建子目录
将创建的沙盒路径在Documents目录下加一个子目录,代码如下,看是否依然可以写入:
for(inti=0;i<10000;i++){/* 创建图片沙盒绝对路径 */NSString*path=[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject]stringByAppendingString:[NSStringstringWithFormat:@"/subfolder/test%i.png",i]];/* 图片写入沙盒Documents目录下 */[datawriteToFile:pathatomically:YES];}
工程运行后观察Debug会话界面硬盘没有任何写入,因此不能直接在沙盒创建子目录写入数据:
网友评论