### 沙盒分組目錄清單
#### 1 Documents
用于存儲用戶生成的文件、其他數據及其他程序不能重新創建的文件,默認文件通過iCloud自動備份。如果不需要iCloud備份,則設置標記
~~~
注明不備份
NSURLIsExcludedFromBackupKey
1.1 讀取Documents目錄代碼
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSLog(@"path:%@", path);
//1.2 標記不備份文件
+ (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]);
NSError *error = nil;
BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES]
forKey: NSURLIsExcludedFromBackupKey error: &error];
if(!success){
NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error);
}
return success;
}
~~~
#### 2 Library
存儲項目緩存,常用設置等
~~~
2.1 讀取Cache目錄代碼
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSLog(@"%@", path);
2.2 讀取Library目錄
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *path = [paths objectAtIndex:0];
NSLog(@"%@", path);
~~~
#### 3 temp
只是臨時使用的數據應該保存到 /tmp 文件夾。盡管 iCloud 不會備份這些文件,但在應用在使用完這些數據之后要注意隨時刪除,避免占用用戶設備的空間
~~~
3.1讀取temp文件夾
NSString *tmpDir = NSTemporaryDirectory();
NSLog(@"%@", tmpDir);
~~~
#### 4 項目自帶的.bundle資源束
~~~
項目自帶的資源存放在.bundle中這些資源只讀不能寫
NSString *defaultDBPath = [[NSBundlemainBundle] resourcePath];
~~~
### 存儲方法
#### plist文件存儲
獲取沙河路徑:
NSString *Path = NSHomeDirectory();
獲取 Documents 的路徑
在某個范圍搜索某個文件夾的路徑
~~~
//參數介紹:
1. directory 表示獲取哪個文件夾目錄
2. domainMask 表示查找范圍(NSUserDomainMask 表示在用戶手機上查找)
3. rxpandTitle 表示是否展開波浪號
NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
//拼接文件路徑
NSString *filePath = [docPath stringByAppendingPathComponent:@"array.plist"];
//存儲到plist文件
[數組/字典/基本數據類型對象 writeToFile:filePath atomically:YES];
//讀取:
//調用對應的方法進行讀取 例如數組:
NSArray *array = [NSArray arrayWithContentsOfFile:filePath];
~~~
#### 偏好設置存儲
[NSUserDefaults standardUserDefaults] 是專門用來做偏好設置存儲的
快速做一些簡單的鍵值對的存儲, 底層的封裝方式: 就是包裝了一個字典
不需要關心文件名
~~~
//iOS8之前, 通常還需要做一個同步操作, 就是把緩存數據同步到硬盤當中
[[NSUserDefaults standardUserDefaults] setObject:存儲對象 forKey:@"鍵值"];
//iOS8之前, 一定做一個同步操作, 及時把緩存數據同步到硬盤當中
[[NSUserDefaults standardUserDefaults] synchronize];
//讀取:
NSString *account = [[NSUserDefaults standardUserDefaults] objectForKey:@"鍵值"];
~~~
#### 歸檔存儲
存儲在MARK:中可以存儲自定義對象
~~~
//獲取文件全路徑
//路徑一定要展開, file 必須是全路徑
NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
//拼接文件名
NSString *filePath = [cachePath stringByAppendingPathComponent:@"person.data"];
//歸檔
//對象要歸檔, 一定要遵守 <NSCoding> 協議, 而且要實現 encodeWithCoder 方法
[NSKeyedArchiver archiveRootObject:p toFile:filePath];
//讀取:
Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
//將對象歸檔和解檔時必須寫這兩個方法 告訴對象哪些屬性需要歸檔 和解檔
//歸檔:對象歸檔的時候調用(當將一個自定義對象保存到文件的時候就會調用)
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:_name forKey:NameKey];
[aCoder encodeInteger:_age forKey:AgeKey];
}
//解檔:對象解檔的時候調用(當從文件中讀取一個對象的時候就會調用該方法)
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
super -> NSObject 沒有遵守 NSCoding 協議
//如果父類沒有遵守 NSCoding 協議, 就不需要調用 initWithCoder 方法
if (self = [super init]) {
//一定不能忘記賦值
_name = [aDecoder decodeObjectForKey:NameKey];
_age = [aDecoder decodeIntForKey:AgeKey];
}
return self;
}
~~~