sandbox 沙盒
NSString *sandboxPath = NSHomeDirectory();
—->Home 表示的是用戶的根目錄 (表示應(yīng)用程序的根目錄)
**沙盒中的tmp目錄 **
保存臨時(shí)的數(shù)據(jù), 不會(huì)被itunes備份, 系統(tǒng)會(huì)自動(dòng)清理該目錄
NSString *tmpPath = NSTemporaryDirectory();
沙盒中查找caches目錄 (如邊下邊播的視頻)
->保存需要持久性的數(shù)據(jù)
->該目錄需要提供一個(gè)清理機(jī)制 (清空該目錄)
->itunes是不會(huì)同步該目錄
部分目錄是需要通過(guò)搜索來(lái)查找 需要用到以下方法搜索指定文件夾的路徑
參數(shù):
- 要搜索的文件夾
- 指定要搜索的范圍 - 固定的值, "用戶域"
- 是否要解開(kāi)波浪號(hào) ~ 表示的是用戶的根目錄, iOS開(kāi)發(fā)中一定要YES
NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
// NSCachesDirectory 只有一個(gè)目錄 即緩存目錄
沙盒中查找Documents目錄
注意: 目錄是NSDocumentDirectory, 而不是NSDocumentationDirectory
-> itunes會(huì)同步, icloud也會(huì)同步 (注意: 不能隨便放置臨時(shí)數(shù)據(jù)或者大文件)
->該目錄的文件, 是可以通過(guò)itunes與電腦進(jìn)行共享 (該刪除的還得刪除)
->存放需要持久化保存的數(shù)據(jù)
->系統(tǒng)不會(huì)清理該目錄, 也不需要程序員來(lái)手動(dòng)清理(清空整個(gè)文件夾)
NSString *docuPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
注意
以上兩個(gè)方法查找目錄 如果查找錯(cuò)誤是沒(méi)有提示的 尤其是查找Documents目錄 注意分清方法參數(shù)
如果存在同名的文件, 寫(xiě)入操作會(huì)覆蓋原來(lái)的文件 (沒(méi)有任何提示!)
存儲(chǔ)數(shù)據(jù)/拼接數(shù)據(jù)
當(dāng)要將數(shù)據(jù)寫(xiě)入到沙盒中 需要準(zhǔn)確的路徑
通過(guò)上述方法找到的路徑只能代表到文件夾的路徑 并不是到指定文件的目錄
因此如果需要寫(xiě)入到沙河目錄中的Documents目錄中的plist文件中
需要通過(guò)上述方法找到文件夾目錄
然后拼接加上文件名得到完整的目錄才可以寫(xiě)入 以下是拼接方法 分兩步
先得到文件夾目錄
NSString *docuPath = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES).lastObject;
再拼接成文件具體目錄
NSString *filePath = [docuPath stringByAppendingPathComponent:@"hero.plist"];
—>使用這個(gè)方法會(huì)自動(dòng)加 “/“
—>第三步 寫(xiě)入
BOOL result = [tempArr writeToFile:filePath atomically:YES];
if (result == YES)
{
NSLog(@"寫(xiě)入成功");
}
沙盒當(dāng)中的Preference目錄 (偏好設(shè)置文件夾)
不需要我們直接操作, 偏好設(shè)置的相關(guān)文件會(huì)保存在這里
偏好設(shè)置有系統(tǒng)提供的類專門(mén)用來(lái)處理, 處理的方式類似于字典操作
"NSUserDefaults" 就是系統(tǒng)提供的, 專門(mén)用來(lái)處理用戶偏好設(shè)置 (配置一些默認(rèn)的參數(shù), 如閱讀模式等)
"NSUserDefaults" 是單例對(duì)象, 不要使用init方法來(lái)初始化
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
針對(duì)不同類型的數(shù)據(jù), 有不同的設(shè)置方法
->object : 要設(shè)置的對(duì)象
->key : 綁定該值的唯一key, 通過(guò)該key來(lái)獲取訪值
[defaults setObject:@"夜間模式" forKey:ReadModeKey];
取值
NSString *readMode = [defaults objectForKey:ReadModeKey];
歸檔與解檔
使用歸檔與解檔的作, 是將數(shù)據(jù)持久化的保存到沙盒當(dāng)中
能夠還原成對(duì)象 (模型)
能夠直接將自定義對(duì)象保存起來(lái)
—>plist不支持對(duì)象的保存, 寫(xiě)入失敗, 沒(méi)有任何提示
—>plist文件基本不會(huì)以用來(lái)保存NSData
歸檔與解檔, 需要NSCoding協(xié)議的支持
coding 編碼, NSCoding用來(lái)支持對(duì)象進(jìn)行編碼保存, 解碼還原的協(xié)議
要讓對(duì)象能夠支持歸檔與解檔, 需要做兩個(gè)事件(指對(duì)象實(shí)現(xiàn)了這兩個(gè)要求才符合歸檔解檔的資格)
- 讓對(duì)象遵守NSCoding協(xié)議
- 實(shí)現(xiàn)協(xié)議中兩個(gè)關(guān)鍵的方法
其中兩個(gè)方法要在對(duì)象中實(shí)現(xiàn)
歸檔方法
encode是編碼的意思, coder編碼器
該方法是歸檔的關(guān)鍵操作
將對(duì)象上的屬性保存起來(lái)
要做的事情: 將本對(duì)象所有的屬性進(jìn)行歸檔操作
- (void)encodeWithCoder:(NSCoder *)aCoder
{
NSCoder 表示編碼器, 能夠?qū)傩跃幋a成二進(jìn)制數(shù)據(jù), 可以保存起來(lái)
/*------ 將本對(duì)象所有的屬性進(jìn)行歸檔操作 ------*/
// 不同類型的數(shù)據(jù), 有不同的歸檔方法
[aCoder encodeObject:_name forKey:PropertyNameKey];
[aCoder encodeInteger:_money forKey:PropertyMoneyKey];
}
解檔方法
獲取已經(jīng)保存的對(duì)象屬性, 還原到對(duì)象身上
要做的事情:
- 實(shí)例化一個(gè)本對(duì)象
- 將解檔還原回來(lái)的屬性, 賦值到本對(duì)象身上
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
NSCoder 也是解碼器, 能夠?qū)⒍M(jìn)制數(shù)據(jù)還原成屬性
/*------ 1. 實(shí)例化對(duì)象 ------*/
self = [super init];
if (self) {
/*------ 2. 將解檔出來(lái)的屬性, 還原到自己身上 ------*/
_name = [aDecoder decodeObjectForKey:PropertyNameKey];
_money = [aDecoder decodeIntegerForKey:PropertyMoneyKey];
}
return self;
}
NSKeyedArchiver 能夠?qū)?支持NSCoding協(xié)議的自定義對(duì)象"歸檔保存到硬盤(pán)當(dāng)中
[NSKeyedArchiver archiveRootObject:hero toFile:filePath];
以上方法指的是將hero對(duì)象保存到filePath對(duì)應(yīng)的文件當(dāng)中 (歸檔保存)
保存的對(duì)象必須支持NSCoding協(xié)議
*第一個(gè)參數(shù)指的是一個(gè)遵守了NSCoding協(xié)議的對(duì)象
*第二個(gè)參數(shù)指的是文件的具體路徑
NSKeyedUnarchiver 能夠?qū)?NSKeyedArchiver所保存的歸檔文件, 解析還原成對(duì)象 如下:
HMHero *hero = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];