应用沙盒:(应用的文件系统目录,应用文件夹)
每个iOS应用都有自己的应用沙盒,与其他文件系统隔离,其他应用也不能访问该沙盒。
应用沙盒的目录结构包括:应用程序包和三个文件夹 Documents、Library(Caches 和 Preference)、tmp
//获取应用沙盒 NSString *homePath = NSHomeDirectory();
应用程序包:包含了所有的资源文件和可执行文件。
Documents:保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录。
//获取documents文件夹 NSString *documentsPath= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。
//获取tmp文件夹 NSString *tmpPath = NSTemporaryDirectory();
Library/Caches:保存应用运行时生成的需要持久化的数据,一般存储体积大、不需要备份的非重要数据。
//获取Caches文件夹 NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
Library/Preference:保存应用的所有偏好设置,iOS的Settings(设置)应用会在该目录中查找应用的设置信息。
一、plist------------不能存储自定义对象
//plist的存储 NSArray *arr = @[@"111", @"222"]; //获取Caches文件夹 NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0]; //拼接文件名 NSString *filePath = [cachePath stringByAppendingPathComponent:@"demo.plist"]; [arr writeToFile:filePath atomically:YES];
//plist的读取 NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0]; //拼接文件名 NSString *filePath = [cachePath stringByAppendingPathComponent:@"demo.plist"]; NSArray *arr = [NSArray arrayWithContentsOfFile:filePath]; NSLog(@"%@", arr);
二、Preference(偏好设置)-------不需要关心文件名,可以快速做键值对处理
- (IBAction)save:(id)sender { NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults]; [userDefault setObject:@"xx" forKey:@"account"]; [userDefault setObject:@"11" forKey:@"password"]; //iOS7之前默认不会马上把数据同步到硬盘,而是先放到缓存中 //同步数据 [userDefault synchronize]; }
- (IBAction)read:(id)sender { NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults]; NSString *account = [userDefault objectForKey:@"account"]; NSLog(@"%@", account); }
三、NSKeyedArchiver归档<NSCoding>-------------将自定义对象写入文件进行保存
#import <Foundation/Foundation.h> @interface Person : NSObject <NSCoding> /** 姓名 */ @property(nonatomic, strong) NSString *name; /** 年龄 */ @property(nonatomic, assign) int *age; @end
#import "Person.h" @implementation Person - (void)encodeWithCoder:(NSCoder *)aCoder { //归档自定义对象的属性 [aCoder encodeObject:_name forKey:@"name"]; [aCoder encodeInt:_age forKey:@"age"]; } //解析文件时都会调用initWithCoder方法,而通过代码初始化view,调用init时底层就会调用initWithFrame方法 - (instancetype)initWithCoder:(NSCoder *)aDecoder { if (self == [super init]) { _name = [aDecoder decodeObjectForKey:@"name"]; _age = [aDecoder decodeIntForKey:@"age"]; } return self; } @end
- (IBAction)save:(id)sender { //归档自定义对象 Person *person = [[Person alloc]init]; person.name = @"xx"; person.age = 18; NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0]; //拼接文件名 NSString *filePath = [cachePath stringByAppendingPathComponent:@"person.xx"]; [NSKeyedArchiver archiveRootObject:person toFile:filePath]; } - (IBAction)read:(id)sender { NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0]; //拼接文件名 NSString *filePath = [cachePath stringByAppendingPathComponent:@"person.xx"]; //解档 Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath]; NSLog(@"%@\n%d", p.name, p.age); }
四、SQLite3
五、Core Data