1 iOS应用程序沙盒概念
iOS应用程序只能在为程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等。
每个应用程序都有自己的存储空间
应用程序不能翻过自己的围墙去访问别的存储空间的内容应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行。
2 査看应用程序的沙盒
方法一:打开Finder应用程序,通过"command+shift+G"快捷键打开"前往文件夹"对话框,或者点击桌面选择前往再选择前往文件夹是一样的效果!然后可以在对话框中输入"/users/用户名/library/",这样就可以进入OS X 库名录.然后依次进入该目录下的Application Support/iphone simulator/7.1/Applications子目录(此处是进入 ios 7.1模拟器).文件组织形式如下:
ios 将所有的第三方保存在Applications目录下,每个应用都保存在一个被称为Globally Unique Identifier(GUID)的文件夹中,GUID就是应用程序沙盒.
方法二:在系统密令行窗口可以设置显示隐藏文件,然后在Finder下直接打开。设置查看隐藏文件的方法如下:打开终端,输入命名
显示Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool true
隐藏Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool false
输完单击Enter键,退出终端,再通过Finder直接进入/users/用户名/library/Application Support/iphone simulator/7.1/Applications目录,同样可以看到GUID文件夹.
3 目录结构
默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp。因为应用的沙盒机制,应用只能在几个目录下读写文件
Documents:苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,及除了基于NSUserDefaults的首选项设置之外,应用程序的数据文件都保存在该目录下.iTunes备份和恢复的时候会包括此目录
Library:存储程序的默认设置或其它状态信息;基于NSUserDefaults的受选项参数保存在Library/Preferences目录下.
Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出删除
tmp:提供一个即时创建临时文件的地方。
iTunes在与iPhone同步时,备份所有的Documents和Library文件。
iPhone在重启时,会丢弃所有的tmp文件。
4 获取应用程序沙盒目录
当应用程序需要把运行状态,用户的数据保存下来时,通常会选择保存在应用程序的沙盒的Documents文件夹下,除了基于NSUserDefaults的数据会保存在Library/Preferences目录下,当然一些程序的临时文件会存储在tmp目录下.一旦文件失去作用,应用程序应该立即删除该临时文件,释放手机上宝贵的存储空间.
当我们决定把文件保存在Documents文件夹下是,需要思考一个问题,应用存储到底把数据保存在单个文件中还是多个文件中?
通常来说,建议使用单个文件保存数据,这样使用简单.比如保存一些基本数据,程序可以考虑将数据保存到NSArray或者NSDictionary中,接下里通过writeToFile: atomically:方法将数据写入单个文件中.当应用程序启动的时候,可调用NSArray的arrayWithContentsOfFile:或者NSDictionary的dictionaryWithContentsOfFile:方法获取文件中的数据,根据文件的内容恢复程序的状态.这种方法简单:但是缺点在于,每次读取文件内容总是一次性加载全部文件内容,这样可能导致内存紧张,保存文件内容时只改动了很少的一部分内容,程序也将NSArray或者NSDictionary中所有的数据写入文件.
使用多文件保存数据是另一种持久化存储方法,假如我们要编写一个处理电子邮件的引用,由于每份电子邮件的内容都可能比较大,而且电子邮件之间关联性较小,因此可以使用多文件存储.使用多文件存储的优点和缺点:
优点:应用程序需要哪部分数据,就加载哪个文件,从而避免一次性加载所有的持久化数据带来的内存紧张,应用程序修改了哪部分数据,只要保存对应的文件即可,这样可以避免保存所有的持久化数据.
缺点:多文件保存数据必然编程相对复杂,可能需要额外的数据结构去管理持久化内容与存储文件之间的对应关系.
一般来说,如果应用程序需要保存,读取的数据量不大,则可以使用NSArray或者NSDictionary来保存,读取数据.当数据量较大时,使用SQLite3或者CoreData.