iOS 沙盒

最近在做数据库缓存和清除缓存功能,了解了一下app下各个文件的用途。

每个APP的沙盒下的目录结构,如图(苹果官方文档):

iOS 沙盒_第1张图片

开发人员主要关注的是Documents、Library和Temp三个文件(以下是官方英文翻译过的):

一、沙盒结构

1、Documents : 使用此目录来存储用户生成的内容。可以通过文件共享向用户提供该目录的内容;因此,这个 目录应该只包含您希望向用户公开的文件。这个目录的内容由iTunes和iCloud备份。

2、Library : 这是任何不是用户数据文件的文件的顶级目录。您通常将文件放在几个标准子目录中的一个中。iOS应用程序通常使用应用程序支持和缓存子目录;但是,您可以创建自定义子目录。使用库子目录来获取您不想让用户看到的任何文件。您的应用程序不应该使用这些目录为用户数据文件。库目录的内容(除了缓存子目录之外)由iTunes和iCloud备份。

    该目录下有两个子目录:

        1)、Preferences:此目录包含特定于应用程序的首选项文件。您不应该自己在这个目录中创建文          件。相反,使用NSUserDefaults类或CFPreferences API来获取和设置应用程序的首选项值。在iOS中,这个目录的内容被iTunes和iCloud备份。

        2)、Caches :使用此目录来编写应用程序可以轻松重新创建的任何特定于应用程序的支持文件。您的应用程序通常负责管理该目录的内容,并根据需要添加和删除文件。在iOS 5.0和以后的版本中,系统在磁盘空间非常低的情况下可能会删除缓存目录。这在应用程序运行时不会发生。但是,请注意,从备份中恢复并不一定是缓存目录可以被删除的惟一条件。

        如此之外,可以创建子文件夹。可以用来放置您希望被备份但不希望被用户看到的数据。该路径下的文件夹,除Caches以外,都会被iTunes备份。

3、Temp:使用此目录来编写不需要在应用程序启动之间持久保存的临时文件。应用程序在不再需要时,应该从该目录删除文件;但是,当你的应用程序没有运行时,系统可以清除这个目录。该目录的内容不支持iTunes或iCloud。

二、获取各个文件目录的路径

获取目录路径的方法:

// 获取沙盒主目录路径NSString*homeDir =NSHomeDirectory();

// 获取Documents目录路径NSString*docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) firstObject];

// 获取Library的目录路径NSString*libDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES) lastObject];

// 获取Caches目录路径NSString*cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES) firstObject];

// 获取tmp目录路径NSString*tmpDir =NSTemporaryDirectory();

获取应用程序程序包中资源文件路径的方法:

NSLog(@"%@",[[NSBundlemainBundle] bundlePath]);NSString*imagePath = [[NSBundlemainBundle] pathForResource:@"apple"ofType:@"png"];UIImage*appleImage = [[UIImagealloc] initWithContentsOfFile:imagePath];


NSSearchPathForDirectoriesInDomains方法用于查找目录,返回指定范围内的指定名称的目录的路径集合。有三个参数:

**directory** NSSearchPathDirectory类型的enum值,表明我们要搜索的目录名称,比如这里用NSDocumentDirectory表明我们要搜索的是Documents目录。如果我们将其换成NSCachesDirectory就表示我们搜索的是Library/Caches目录。

** * domainMask* ** NSSearchPathDomainMask类型的enum值,指定搜索范围,这里的NSUserDomainMask表示搜索的范围限制于当前应用的沙盒目录。还可以写成NSLocalDomainMask(表示/Library)、NSNetworkDomainMask(表示/Network)等。

** * expandTilde* ** BOOL值,表示是否展开波浪线。我们知道在iOS中的全写形式是/User/userName,该值为YES即表示写成全写形式,为NO就表示直接写成“~”。

该值为NO:Caches目录路径~/Library/Caches

该值为YES:Caches目录路径

/var/mobile/Containers/Data/Application/E7B438D4-0AB3-49D0-9C2C-B84AF67C752B/Library/Caches


转载链接:https://www.jianshu.com/p/dd3f120eb249

你可能感兴趣的:(iOS 沙盒)