沙盒
在OS X系统中查看应用程序沙盒,有两种方式:
(1) 打开Finder应用程序,通过“command+shift+G”快捷键打开“前往文件夹”对话框,用户可以在该对话框中输入“/users/<用户名>/library/”,这样即可进入OS X的库名录。然后依次进入该目录下的ApplicationSupport/iPhone Simulator/7.0/Applications子目录。iOS将所有的第三方库保运在Aoolications目录下,每个应用都保存在一个称谓Globally Unique Identifier(GUID)的文件夹中,GUID文件夹就是应用程序沙盒。
(2) 在OS X系统命令行窗输入“defaultwrite com.apple.finder AppleShowAllFiles –bool true”,然后退出Finder,重启Finder程序即可看到隐藏文件额文件夹,这样就可以通过Finder直接进入/users/<用户名>/library/Application Support/iPhone Simulator/7.0/Applications目录,同样可以在该目录下看到所有第三方应用程序的GUID文件夹。
打开任何应用程序的文件夹,都可看到如下文件结构:
(1) Doucuments:除了基于NSUserDefaults的首选择项设置之外,应用程序的数据、文件都保存在该目录下。
(2) Library:基于NSUserDefaults的首选项参数保存在Library/Preferences目录下。
(3) tmp:该目录供应应用程序存储临时文件,当iOS执行同步时,iTunes不会备份tmp目录下的文件。当要应用程序不再需要某个临时文件时,应该负责删除tmp目录下的临时文件,避免占用内存空间。
获取Documents目录
由于我们的应用程序位于GUID文件夹内,这个文件夹的名称看上去完全随机,Foundation提供了NSSearchPathForDirectoriesInDomains()函数,示例代码如下:
NSArry *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUser DonmainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
获取tmp目录
获取tmp目录,直接调用NSTemporaryDirectory()函数即可,该函数将会返回一个字符串,该字符串代表了tmp目录的完整路径,示例代码如下:
NSString *tempPath = NSTemoraryDirectory();
使用Settings Bundle
Settings Bundle时应用程序中的一组特殊文件,用于高速iOS自带的Settings应用,该应用程序希望通过Setting应用来手机程序参数。
使用SettingBundle设置应用程序参数的最大优势在于:无须程序员开发界面,应用的设置界面完全由Settings应用提供,开发者只要提供Setting Bundle这组文件即可。
当开发者为应用提供了SettingBundle之后,该应用的参数设置界面由系统的Settings应用提供,用户设置的程序参数也由Settings负责保存,每次打开Settings进行设置时,Settings负责读取用户设置的参数。应用程序的参数设置界面、数据存储、读取逻辑都由Settings应用负责。
属性列表
对于只需要保存简单数据的应用而言,使用属性列表是一个不错的选择,NSArray、NSDictionary对象都提供了writeToFile:(NSString*)filePath atonically:(BOOL)flag方法,该方法可以吧NSArray和NSDictionary包含的数据写入属性文件。
当恢复这些数据时,只要调用NSArray、NSDictionary的xxxWithContentsOfFile:(NSString*)filePath方法执行初始化即可。
需要指出的是,只有当NSArray和NSDictionary包含的数据写入属性文件保存如下类型的对象后,才可调用writeToFile:(NSString*)filePath atomically:(BOOL)flag方法执行保存:
(1) NSArray和NSMutableDictionary。
(2) NSDictionary和NSMutableDictionary。
(3) NSData和NSMutableData。
(4) NSString和NSMutableString。
(5) NSValue和NSNumber。
这意味着如果NSArry、NSDictionary中保存了其他类型的对象,或保存了程序员自定义类的实例,将不能直接调用NSArray、NSDictionary的writeToFile:(NSString*)filePath atomically:(BOOL)flag方法执行保存。