一渐排、什么是沙盒(SandBox)
1、每一個(gè)iOS應(yīng)用程序都會(huì)為自己創(chuàng)建一個(gè)文件系統(tǒng)目錄(相當(dāng)于一個(gè)文件夾)灸蟆,這就是沙盒驯耻。
這里需要注意的就是應(yīng)用程序每運(yùn)行一次,沙盒文件名稱就會(huì)發(fā)生改變炒考。
2可缚、應(yīng)用程序沙盒路徑
點(diǎn)擊桌面空白處==>點(diǎn)擊前往==>同時(shí)按住Alt鍵==>選中資源庫==>如下操作就可以找到該應(yīng)用程序的沙盒路徑了。
二斋枢、什么是沙盒機(jī)制
1帘靡、iOS中的沙盒機(jī)制是一種安全體系。
2瓤帚、它規(guī)定了應(yīng)用程序只能在為該應(yīng)用程序創(chuàng)建的文件夾(沙盒)內(nèi)訪問文件描姚,不可以訪問其他沙盒內(nèi)的內(nèi)容(在iOS8之后已經(jīng)部分開始訪問)涩赢。
3.所有的非代碼文件都保存在這個(gè)地方,比如圖片轩勘、聲音筒扒、屬性列表(plist)、sqlite數(shù)據(jù)庫和文本文件等绊寻。
特點(diǎn)
- 每個(gè)應(yīng)用程序的活動(dòng)范圍都限定在自己的沙盒里
- 不能隨意跨越自己的沙盒去訪問別的應(yīng)用程序沙盒中的內(nèi)容(在iOS8之后已經(jīng)部分開始訪問)花墩。
- 應(yīng)用程序向外請(qǐng)求或接收數(shù)據(jù)都需要經(jīng)過權(quán)限認(rèn)證,例如定位澄步、麥克風(fēng)冰蘑、相冊(cè)等訪問權(quán)限。
三村缸、應(yīng)用程序的沙盒目錄
應(yīng)用程序的沙盒目錄下會(huì)有三個(gè)文件夾Documents祠肥、Library、tmp
- Documents:????????????????????????????????????????????????????????????????????????保存應(yīng)用運(yùn)行時(shí)生成的需要持久化的數(shù)據(jù)王凑,iTunes不會(huì)自動(dòng)備份該目錄搪柑。
- Library:存儲(chǔ)程序的默認(rèn)設(shè)置和其他狀態(tài)信息,iTunes會(huì)自動(dòng)備份該目錄索烹。
Library/Caches:存放緩存文件工碾,iTunes不會(huì)備份此目錄,此目錄下的文件不會(huì)再應(yīng)用退出后刪除百姓,一般存放體積比較大渊额,不是特別重要的資源。
Library/Preferences:保存應(yīng)用的所有偏好設(shè)置垒拢,iOS的settings應(yīng)用會(huì)在該目錄中查找應(yīng)用的設(shè)置信息旬迹,iTunes會(huì)自動(dòng)備份該目錄。 - tmp:保存應(yīng)用運(yùn)行時(shí)的臨時(shí)數(shù)據(jù)求类,使用完畢后再將相應(yīng)的文件從該目錄刪除奔垦,應(yīng)用沒有運(yùn)行時(shí),系統(tǒng)也有可能清除該目錄下的文件尸疆,iTunes不會(huì)自動(dòng)備份該目錄椿猎。iphone重啟時(shí),該目錄下的文件會(huì)被刪除寿弱,為了安全起見犯眠,我們不會(huì)把數(shù)據(jù)存放到tem中。
四症革、如何獲取沙盒路徑筐咧、Documents目錄、 Library目錄、tmp目錄
- 獲取沙盒路徑
//沙盒的主路徑
NSString* homePathString=NSHomeDirectory();
- 獲取Documents目錄
//documents路徑
//第一個(gè)參數(shù):要找尋的目標(biāo)文件
//第二個(gè)參數(shù):查找的范圍(要找尋的目標(biāo)文件夾的父級(jí)文件夾)
//第三個(gè)參數(shù):文件路徑是否展開
NSArray* documentsArray=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* documentPath=documentsArray.firstObject;
- 獲取Library目錄
//Library路徑
NSArray* libraryArray=NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString* libraryPath=libraryArray.firstObject;
NSLog(@"libraryPath---%@",libraryPath);
//caches路徑
NSArray* cacheArray=NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString* cachesPath=cacheArray.firstObject;
NSLog(@"cachesPath----%@",cachesPath);
//preference路徑
NSString* preferencePath=[libraryPath stringByAppendingString:@"/preferences"];
NSLog(@"preferencePath----%@",preferencePath);
- 獲取tmp目錄
//tmp路徑
NSString* tmpPath=NSTemporaryDirectory();
五量蕊、簡(jiǎn)單對(duì)象的讀取操作
1铺罢、NSString的寫入
#pragma mark------文件的寫入
-(void)writeToFile{
//將一段字符串寫入documents文件夾中
NSString* documentsPath=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
//在上面的路徑下創(chuàng)建一個(gè)文件路徑用來盛放文字
NSString* txtPath=[documentsPath stringByAppendingPathComponent:@"string.txt"];
//將文字寫入文件中,當(dāng)文字寫入文件的時(shí)候危融,如果文件不存在畏铆,系統(tǒng)會(huì)先創(chuàng)建,在寫入吉殃;如果存在辞居,直接寫入。新的內(nèi)容會(huì)將原來的內(nèi)容覆蓋掉
NSString* contentStr=@"我是文本內(nèi)容";
//寫入操作
//第一個(gè)參數(shù):文件路徑
//第二個(gè)參數(shù):原子性 YES:在寫入過程中會(huì)產(chǎn)生一個(gè)臨時(shí)文件蛋勺,當(dāng)內(nèi)容寫入完整的時(shí)候瓦灶,才會(huì)將內(nèi)容移動(dòng)到目標(biāo)文件中 NO:直接在目標(biāo)文件上操作,不產(chǎn)生臨時(shí)文件抱完,有可能損壞目標(biāo)文件
//第三個(gè)參數(shù):字符串的編碼格式
//第四個(gè)參數(shù):如果寫入出問題贼陶,這里會(huì)產(chǎn)生一個(gè)錯(cuò)誤日志,一般不需要錯(cuò)誤日志巧娱,直接賦值為nil
//error對(duì)象用來保存錯(cuò)誤日志
NSError* error=nil;
BOOL isSuccsess=[contentStr writeToFile:txtPath atomically:YES encoding:(NSUTF8StringEncoding) error:&error];
//只知道寫入的結(jié)果碉怔,沒有失敗過程描述
if (isSuccsess) {
NSLog(@"成功");
}else{
NSLog(@"失敗");
}
}
運(yùn)行后會(huì)在documents文件下顯示此文本,在這里我們也可以將文本格式改為.plist禁添,它就會(huì)以xml格式存在撮胧。無論文本的后綴名是什么,我們都可以用文本編輯的方式打開老翘,所以有時(shí)候芹啥,png不一定是圖片,也有可能是文本或其他格式铺峭。
2墓怀、NSString的讀取
#pragma mark------文件的讀取
-(void)readFile{
//要讀取文件的路徑
NSString* docPath=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
NSString* txtPath=[docPath stringByAppendingPathComponent:@"string.txt"];
//讀取文件
NSString* readStr=[NSString stringWithContentsOfFile:txtPath encoding:NSUTF8StringEncoding error:nil];
NSLog(@"我是讀出來的---%@",readStr);
}
同理,其他類型的數(shù)據(jù)寫入和讀取的時(shí)候都是類似的卫键,只是方法不同而已傀履,下面是幾種數(shù)據(jù)寫入和讀取的方法
3、相對(duì)于以上幾種NSData會(huì)比較特殊些莉炉,例如圖片的寫入
#pragma mark------圖片的寫入
-(void)imgWriteToFile{
//document路徑
NSArray* pathArray=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
//在上面的路徑下創(chuàng)建一個(gè)文件路徑用來盛放圖片
NSString* docPath=pathArray.firstObject;
NSString* imgPath=[docPath stringByAppendingString:@"/333.png"];
//圖片寫入
//將圖片轉(zhuǎn)換為NSData類型
UIImage* img=[UIImage imageNamed:@"10.JPG"];
NSData* imgData=UIImageJPEGRepresentation(img, 1.0);
[imgData writeToFile:imgPath atomically:YES];
}
以上幾種方法均要在ViewDidLoad中調(diào)用才可以實(shí)現(xiàn)