沙箱模型的有四個(gè)文件夾
documents,tmp笋鄙,app师枣,Library。
四個(gè)文件夾分別是什么
Documents 目錄:您應(yīng)該將所有de應(yīng)用程序數(shù)據(jù)文件寫入到這個(gè)目錄下萧落。這個(gè)目錄用于存儲(chǔ)用戶數(shù)據(jù)或其它應(yīng)該定期備份的信息践美。
tmp 目錄:這個(gè)目錄用于存放臨時(shí)文件洗贰,保存應(yīng)用程序再次啟動(dòng)過程中不需要的信息。
AppName.app 目錄:這是應(yīng)用程序的程序包目錄拨脉,包含應(yīng)用程序的本身哆姻。由于應(yīng)用程序必須經(jīng)過簽名,所以您在運(yùn)行時(shí)不能對這個(gè)目錄中的內(nèi)容進(jìn)行修改玫膀,否則可能會(huì)使應(yīng)用程序無法啟動(dòng)矛缨。
Library 目錄:這個(gè)目錄下有兩個(gè)子目錄:Caches 和 Preferences
Library/Preferences 目錄:包含應(yīng)用程序的偏好設(shè)置文件。您不應(yīng)該直接創(chuàng)建偏好設(shè)置文件,而是應(yīng)該使用NSUserDefaults類來取得和設(shè)置應(yīng)用程序的偏好.(利用NSUserDefaults存儲(chǔ)的數(shù)據(jù)就是在沙盒中的這個(gè)文件夾中)
Library/Caches 目錄:用于存放應(yīng)用程序?qū)S玫闹С治募4鎽?yīng)用程序再次啟動(dòng)過程中需要的信息田度。
沙盒中各個(gè)目錄的路徑獲取方式
1.獲取沙盒中home目錄(主目錄惶翻,沙盒的最外層)的路徑
NSString *homeDir = NSHomeDirectory();
NSLog(@"獲取沙盒中home目錄路徑\n %@",homeDir);
打印結(jié)果
2016-06-17 21:12:06.264 sd[9698:422028] 獲取沙盒中home目錄路徑
/Users/zhangbin/Library/Developer/CoreSimulator/Devices/46A6D7C4-D373-4684-A640-4B4A1FF2BC6E/data/Containers/Data/Application/5E081742-A012-48E6-B70A-77906491B714
2.獲取沙盒中Documents目錄的路徑
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
NSLog(@"獲取沙盒中Documents目錄的路徑\n %@",docDir);
打印結(jié)果:
2016-06-17 21:12:06.264 sd[9698:422028] 獲取沙盒中Documents目錄的路徑
/Users/zhangbin/Library/Developer/CoreSimulator/Devices/46A6D7C4-D373-4684-A640-4B4A1FF2BC6E/data/Containers/Data/Application/5E081742-A012-48E6-B70A-77906491B714/Documents
3.獲取沙盒中Caches目錄的路徑
NSArray *path2 = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachesDir = [path2 objectAtIndex:0];
NSLog(@"獲取沙盒中Caches目錄的路徑\n %@",cachesDir);
打印結(jié)果:
2016-06-17 21:12:06.264 sd[9698:422028] 獲取沙盒中Caches目錄的路徑
/Users/zhangbin/Library/Developer/CoreSimulator/Devices/46A6D7C4-D373-4684-A640-4B4A1FF2BC6E/data/Containers/Data/Application/5E081742-A012-48E6-B70A-77906491B714/Library/Caches
4.獲取沙盒中tmp目錄的路
NSString *tmpDir = NSTemporaryDirectory();
NSLog(@"獲取沙盒中tmp目錄的路徑\n %@",tmpDir);
打印結(jié)果:
2016-06-17 21:12:06.265 sd[9698:422028] 獲取沙盒中tmp目錄的路徑
/Users/zhangbin/Library/Developer/CoreSimulator/Devices/46A6D7C4-D373-4684-A640-4B4A1FF2BC6E/data/Containers/Data/Application/5E081742-A012-48E6-B70A-77906491B714/tmp/
NSUserDefaults詳細(xì)介紹
- 1.NSUserDefaults類用于保存應(yīng)用程序設(shè)置和屬性以及用戶數(shù)據(jù)。例如蔬芥,你可以存儲(chǔ)用戶在應(yīng)用程序中使用的圖片或默認(rèn)顏色方案,或者背景等。這些對象存儲(chǔ)在iOS所謂的“defaults系統(tǒng)”中述召。
- 2.iOS的defaults系統(tǒng)在整個(gè)app中都是可用的,因此存放到defaults系統(tǒng)中的數(shù)據(jù)也是整個(gè)應(yīng)用程序生命周期中可用的蟹地。也就是說积暖,無論用戶關(guān)閉程序還是關(guān)機(jī),在用戶再次打開程序或開機(jī)后這些數(shù)據(jù)仍然存在怪与。
- 3.從NSUserDefaults返回的值是不可改變的夺刑,即便是你在存儲(chǔ)的時(shí)候使用的是可變的值。例如你使用mutable string做為“MyStringDefault”的值分别,當(dāng)你做使用stringForKey:方法獲取的值遍愿,這個(gè)值仍然是不可變的。
- 4.NSUserDefaults是單例耘斩,同時(shí)也是線程安全的
5.NSUserDefaults可以存儲(chǔ)的數(shù)據(jù)類型只能是property list類型的數(shù)據(jù)沼填。(NSData,NSString煌往,NSNumber倾哺,NSDate,NSArray刽脖,NSDictionary)
如果你想保存其他類型羞海,如UIImage,你應(yīng)該進(jìn)行編碼(即archive)曲管,或者將它轉(zhuǎn)換為NSData却邓、NSNumber或者NSString。6.[NSUserDefaults standardUserDefaults]用來記錄一下永久保留的數(shù)據(jù)非常方便院水,不需要讀寫文件腊徙,而是保留到一個(gè)NSDictionary字典里简十,由系統(tǒng)保存到文件里,系統(tǒng)會(huì)保存到該應(yīng)用下的/Library/Preferences/gongcheng.plist文件中撬腾。需要注意的是如果程序意外退出螟蝙,NSUserDefaultsstandardUserDefaults數(shù)據(jù)不會(huì)被系統(tǒng)寫入到該文件,不過可以使用[[NSUserDefaultsstandardUserDefaults] synchronize]命令直接同步到文件里民傻,來避免數(shù)據(jù)的丟失胰默。
手動(dòng)保存的文件在documents文件里,Nsuserdefaults保存的文件在Library/Preferences 目錄文件夾里;
NSUserDefaults六大方法:
一.得到共享的NSUserDefaults實(shí)例
+ (NSUserDefaults *)standardUserDefaults
二.初始化一個(gè)NSUserDefaults對象
- (id)initWithUser:(NSString *)username
三.得到默默認(rèn)值
- objectForKey:;
- stringForKey:;
- arrayForKey:;
- dictionaryForKey:;
- dataForKey:;
- stringArrayForKey:;
- integerForKey:;
- floatForKey:;
- doubleForKey:;
- boolForKey:;
- URLForKey:;
四.設(shè)置默認(rèn)值
- setInteger:forKey:;
- setFloat:forKey:;
- setDouble:forKey:;
- setBool:forKey:;
- setURL:forKey:;
五.記錄默認(rèn)值
- registerDefaults:;
六.刪除默認(rèn)值
- removeObjectForKey:;
如何使用NSUserDefaults?
你可以把它當(dāng)做是一個(gè)小型的數(shù)據(jù)庫漓踢,在存儲(chǔ)和讀取數(shù)據(jù)之前牵署,你需要調(diào)用方法: standardUserDefaults :
如:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
我把這個(gè)方法理解為,打開數(shù)據(jù)庫的大門喧半,這樣你就可以對里面的數(shù)據(jù)做各種操作奴迅,也可以將存儲(chǔ)數(shù)據(jù)進(jìn)來。
存儲(chǔ)數(shù)據(jù)和讀取數(shù)據(jù)有各種方法挺据,需要注意的是取具,存儲(chǔ)數(shù)據(jù)需要完成方法 synchronize:,這個(gè)方法完成的作用是同步數(shù)據(jù)扁耐,也就是將你做出改變的數(shù)據(jù)更新者填。
如:
[defaults synchronize];
NSUserDefaults具體用法
IOS提供了一個(gè)輕量級的快速數(shù)據(jù)存儲(chǔ)方式:NSUserDefaults,對于SQLite這樣的數(shù)據(jù)庫方式,適合大量數(shù)據(jù)的存儲(chǔ)做葵。
程序運(yùn)行的時(shí)候從用戶默認(rèn)的數(shù)據(jù)庫中讀取程序的設(shè)置,同時(shí)NSUserDefaults的緩存避免了在每次讀取數(shù)據(jù)時(shí)候都打開用戶默認(rèn)數(shù)據(jù)庫的操作心墅,所有數(shù)據(jù)都放在內(nèi)存中酿矢,讀寫速度很快。
1.獲取 NSUserDefaults
這是一個(gè)單例怎燥,獲取非常方便瘫筐,隨時(shí)可以調(diào)用:
[NSUserDefaults standardUserDefaults];
2.寫入數(shù)據(jù)到NSUserDefaults中
[[NSUserDefaults standardUserDefaults] setInteger:10 forKey:@"test"];
[[NSUserDefaults standardUserDefaults] setFloat:10.0 forKey:@"test"];
..... NSUserDefaults 支持多種數(shù)據(jù)類型铐姚,用 key來標(biāo)示
3.讀取NSUserDefaults中存儲(chǔ)的數(shù)據(jù)
int a = [[NSUserDefaults standardUserDefaults] integerForKey:@"test"];
float a = [[NSUserDefaults standardUserDefaults] floatForKey:@"test"];
策肝。。隐绵。當(dāng)然也支持其他各種類型
4.保存數(shù)據(jù)之众,實(shí)現(xiàn)持久化存儲(chǔ)
[[NSUserDefaults standardUserDefaults] synchronize];
5.判斷數(shù)據(jù)是否存在
if([[NSUserDefaults standardUserDefaults] objectForKey:@""test"]==nil){
......
}else{
......
}
NSUserDefaults和Property List(屬性表,也就是plist文件)區(qū)別
- Property List (屬性表)
- 定義:Property List文件是一種用來存儲(chǔ)序列化后的對象 的文件。屬性列表文件的文件擴(kuò)展名 為.plist依许,因此通常被稱為 plist 文件棺禾。
- pl是一種格式,包含了(NSData峭跳,NSString膘婶,NSNumber缺前,NSDate,NSArray悬襟,NSDictionary 這六種任意組合創(chuàng)建的結(jié)構(gòu)體)
- NSUserDafults
- NSUserDafults相當(dāng)于一個(gè)緩存衅码,而plist是一個(gè)文件。
- NSUserDefault脊岳,它其實(shí)也是以property list 的形式來存儲(chǔ)的逝段,但是它有限制,比如說NSColor和NSFont等類型式不能夠直接存儲(chǔ)的逸绎,我們必須要轉(zhuǎn)換他們惹恃,要把他們轉(zhuǎn)換成NSData類型來存。
如何獲取利用NSUserDefaults存儲(chǔ)數(shù)據(jù)的路徑棺牧?
- 1.先獲取沙盒中home目錄(主目錄巫糙,沙盒的最外層)的路徑
NSString *homeDir = NSHomeDirectory();
NSLog(@"獲取沙盒中home目錄路徑\n %@",homeDir);
- 2.然后找到Library/Preferences這個(gè)目錄,這個(gè)目錄下的plist文件就是數(shù)據(jù)的最終路徑
iOS中數(shù)據(jù)存儲(chǔ)方式
- 方式1.Plist(利用writeToFile/arrayWithContentsOfFile)
// 向plist文件中存數(shù)據(jù)
NSArray *data = @[@"Marry",@"Lucy"];
[data writeToFile:@"/Users/zhangbin/Desktop/zhangbin.plist" atomically:YES];
// 再次向這個(gè)plist文件中存數(shù)據(jù)時(shí),首先必須得取出這個(gè)plist中的數(shù)據(jù),然后再添加數(shù)據(jù)颊乘,最后才可以寫入到plist文件
NSMutableArray *data = [NSMutableArray arrayWithContentsOfFile:@"/Users/zhangbin/Desktop/zhangbin.plist"];
[data addObject:@"Tom"];
[data writeToFile:@"/Users/zhangbin/Desktop/zhangbin.plist" atomically:YES];
精華demo
#import "ViewController.h"
@interface ViewController ()
@property(nonatomic,strong)NSDictionary *Dic;
@property(nonatomic,strong)NSMutableDictionary *sectionDic;
@end
@implementation ViewController
-(NSDictionary *)Dic{
if(_Dic == nil){
_Dic = [NSDictionary dictionary];
}
return _Dic;
}
-(NSMutableDictionary *)sectionDic{
if(_sectionDic == nil){
_sectionDic = [NSMutableDictionary dictionary];
}
return _sectionDic;
}
// 例2:復(fù)雜測試
- (void)viewDidLoad {
[super viewDidLoad];
NSMutableArray * sectionArr = [[NSMutableArray alloc] init];
NSMutableDictionary * rowDic = [[NSMutableDictionary alloc] init];
for (int i = 0; i < 2; i ++) {
for (int j = 0; j < 4; j ++) {
[rowDic setObject:@"NO" forKey:@"selected"];// 等價(jià)rowDic[@"selected"]=@"NO";
[sectionArr addObject:rowDic];
}
// 總結(jié):key不能為NSNumber参淹,key只能為字符串。 value可以為字符串乏悄,也可以為NSNumber
// [self.sectionDic setObject:sectionArr forKey:@(i)];// 錯(cuò)誤寫法
// 正確寫法
[self.sectionDic setObject:sectionArr forKey:[NSString stringWithFormat:@"%zd",i]];// 等價(jià) self.sectionDic[ [NSString stringWithFormat:@"%zd",i]] = sectionArr;
}
/*****************************寫plist文件到本地路徑*****************************/
BOOL a = [self.sectionDic writeToFile:@"/Users/zhangbin/Desktop/Company/zb6.plist" atomically:YES];
if (a == 1) {
NSLog(@"寫入成功");
}else{
NSLog(@"寫入失敗");
}
NSLog(@"%@",self.sectionDic);
/*****************************寫plist文件到沙盒********************************/
// 獲取沙盒中Documents目錄的路徑
NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *plistPath1 = [paths objectAtIndex:0];
//拼接plist文件,得到完整的文件名
NSString *filename = [plistPath1 stringByAppendingPathComponent:@"CoderZb.plist"];
// 打印plist文件的總路徑
NSLog(@"%@",filename);
[self.sectionDic writeToFile:filename atomically:YES];
// 打印讀取plist文件
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:filename];
// 打印plist文件中的內(nèi)容
NSLog(@"%@",dict);
}
// 例1:簡單測試
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
// 總結(jié):key不能為NSNumber浙值,key只能為字符串。 value可以為字符串檩小,也可以為NSNumber
// NSDictionary *dict3=@{@"a":@"b",@"c":@"d"};// 寫入成功
// NSDictionary *dict3=@{@(1):@"b",@"c":@"d"};// 寫入失敗
NSDictionary *dict3=@{@"a":@(2),@"c":@"d"};// 寫入成功
[dict3 writeToFile:@"/Users/zhangbin/Desktop/Company/zhangbin.plist" atomically:YES];
}
@end
- 方式2.Preference(利用NSUserDefaults取得和設(shè)置應(yīng)用程序的偏好.)
// 將NSString 對象存儲(chǔ)到 NSUserDefaults 中
NSString *passWord = @"1234567";
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[user setObject:passWord forKey:@"userPassWord"];
// 從NSUserDefaults中取出數(shù)據(jù),只需要取出key 對應(yīng)的值就好了
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
NSString *passWord = [ user objectForKey:@"userPassWord"];
- 方式3.NSCoding(利用NSKeyedArchiver\NSkeyedUnarchiver)
/************toFile和unarchiveObjectWithFile的參數(shù)為字符串類型的路徑*********************/
NSDictionary *glossary = [NSDictionary dictionaryWithObjectsAndKeys:@"A",@"B", @"C",@"D",nil];
NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"glossary.archive"];
// 歸檔時(shí),toFiled的參數(shù)寫成路徑规求。解檔時(shí),objectForKey的參數(shù)也必須寫成路徑
// 使用NSKeyedArchiver歸檔
[NSKeyedArchiver archiveRootObject:glossary toFile:path];
NSLog(@"%@",path);
// 使用NSKeyedUnarchiver解檔
NSDictionary *readglossary = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
for(NSString *key in readglossary){
NSLog(@"%@: %@",key,[readglossary objectForKey:key]);
}
/************toFile和unarchiveObjectWithFile的參數(shù)僅僅是普通的字符串*********************/
// dictionaryWithObjectsAndKeys的參數(shù)特殊筐付,從冒號開始,@"A"為鍵,@"B"為值,以此類推
NSDictionary *glossary = [NSDictionary dictionaryWithObjectsAndKeys:@"A",@"B", @"C",@"D",nil];
// 歸檔時(shí),toFiled的參數(shù)寫成字符串.那么解檔時(shí),objectForKey的參數(shù)也必須寫成字符串
[NSKeyedArchiver archiveRootObject:glossary toFile:@"glossary.archive"];
// 將文件glossary.archive中的數(shù)據(jù)讀到字典對象并顯示出來
NSDictionary *readglossary = [NSKeyedUnarchiver unarchiveObjectWithFile:@"glossary.archive"];
for(NSString *key in readglossary){
NSLog(@"%@: %@",key,[readglossary objectForKey:key]);
}
方式3打印結(jié)果:
2016-06-17 20:09:12.430 1[7975:345839] B: A
2016-06-17 20:09:12.432 1[7975:345839] D: C
2016-06-17 20:09:12.432 1[7975:345839] E: E
- 方式4.SQLite3(SQLite的第三個(gè)版本)
SQLite3是數(shù)據(jù)庫技術(shù),純C語言版本,是輕量級
- 方式5.Core Data(蘋果原聲的數(shù)據(jù)存儲(chǔ)方式)
Core Data是數(shù)據(jù)庫技術(shù),以SQLite3為基礎(chǔ)的OC版本,且是重量級
各個(gè)方式的優(yōu)缺點(diǎn):
1.方式1和方式2只能存簡單的數(shù)據(jù)類型的對象,例如存NSArray阻肿,NSDictionary.方式1和方式2都是存儲(chǔ)成plist文件瓦戚,所以這兩種方式本質(zhì)是一樣的
2.方式3只要遵守NSCoding協(xié)議,并實(shí)現(xiàn)方法,就能夠?qū)⑷魏晤愋偷膶ο蟠嫒肷澈?/p>
3.方式和方式2和方式3都只能存小數(shù)據(jù),不能存大數(shù)據(jù)
4.存大數(shù)據(jù)必須利用數(shù)據(jù)庫也就是利用方式4或者方式5.因?yàn)槔脭?shù)據(jù)庫檢索數(shù)據(jù)非炒运快较解,如果你想從數(shù)據(jù)庫的1000個(gè)數(shù)據(jù)里面取出100和150之間的數(shù)據(jù),不用讀取全部的1000個(gè)數(shù)據(jù)赴邻,僅僅利用命令即可快速檢索到印衔。如果不利用數(shù)據(jù)庫,而是利用方式1姥敛,方式2当编,方式3,必須得先把1000個(gè)數(shù)據(jù)讀取出來,然后再截串忿偷,速度非常慢金顿。
5.對于大批量的數(shù)據(jù),我們要對這些數(shù)據(jù)做緩存的話,不能用Plist鲤桥、Preference揍拆、NSCoding做緩存,應(yīng)該用SQLite3或者Core Data來做緩存.如果是做小批量的數(shù)據(jù)茶凳,我們用Plist嫂拴、Preference、NSCoding當(dāng)中的哪一個(gè)做緩存都行
注意:無論采取了什么方式贮喧,其實(shí)都是把數(shù)據(jù)存儲(chǔ)到文件中了筒狠,只是這個(gè)文件的類型決定了能存大數(shù)據(jù)還是小數(shù)據(jù),沒有什么可深?yuàn)W的。因?yàn)槲募念愋椭挥杏脤?yīng)的軟件開箱沦,例如 sqlite后綴的文件只能用navicat打開辩恼,navicat是一款數(shù)據(jù)庫管理工具。所以一般我們說將數(shù)據(jù)存到數(shù)據(jù)庫中(不好理解)谓形,換句話說就是將數(shù)據(jù)存到了sqlite后綴的文件中(好理解)
數(shù)據(jù)庫
數(shù)據(jù)庫就是存儲(chǔ)和管理數(shù)據(jù)的倉庫
SQLite是輕量級的嵌入式數(shù)據(jù)庫(非常的輕)灶伊,一般用于Android、iPhone手機(jī)上寒跳,在設(shè)備中聘萨,SQLite只占用幾百K的內(nèi)存,處理速度比Mysql數(shù)據(jù)庫塊
數(shù)據(jù)庫分為關(guān)系型數(shù)據(jù)庫(主流)童太、對象型數(shù)據(jù)庫
-
常用的關(guān)系型數(shù)據(jù)庫:
1.PC端:Oracle米辐、Mysql、SQLServer书释、Access儡循、DB2、Sybase
2.移動(dòng)客戶端:SQLite
使用sqlite3報(bào)錯(cuò)的解決辦法
歸檔征冷、解檔
注意歸檔\解檔 和 對象轉(zhuǎn)成NSData數(shù)據(jù)\將NSData數(shù)據(jù)轉(zhuǎn)成對象的區(qū)別
- 歸檔
[NSKeyedArchiver archiveRootObject:shops toFile:@"/Users/apple/Desktop/shops.data"];
- 解檔
NSMutableArray *shops = [NSKeyedUnarchiver unarchiveObjectWithFile:@"/user/xxx"];
- 對象shop轉(zhuǎn)成NSData數(shù)據(jù)
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:shop];
- 將NSData數(shù)據(jù)轉(zhuǎn)成對象shop
ZBShop *shop = [NSKeyedUnarchiver unarchiveObjectWithData:data];
用SDWebImage清除圖片緩存功能
- 清除原理就是:因?yàn)橛脩魹g覽的緩存圖片默認(rèn)會(huì)存到沙盒中的Library中的Caches目錄下,所以SDWebImage框架底層會(huì)找到沙盒的Library中的Caches目錄下的圖片緩存誓琼,刪除緩存在這里面的圖片检激。沒啥難的,就是找到緩存文件腹侣,刪除即可
- 驗(yàn)證:
- 步驟1:在程序中輸入如下代碼
NSArray *path2 = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachesDir = [path2 objectAtIndex:0];
NSLog(@"獲取沙盒中Caches目錄的路徑\n %@",cachesDir);
步驟2:瀏覽程序中的圖片
步驟3:復(fù)制步驟1中打印出來的路徑叔收,查找路徑的位置
步驟4:點(diǎn)擊清除按鈕,執(zhí)行SDWebImage清除緩存的代碼,看里面的文件是否消失傲隶,如果消失了饺律,可以驗(yàn)證確實(shí)清除了緩存的圖片。
步驟5:如果還不放心跺株,可以在緩存路徑的目錄下复濒,手動(dòng)粘貼幾張圖片脖卖,幾個(gè)文件夾等等,然后你再點(diǎn)擊清除按鈕巧颈,發(fā)現(xiàn)也能刪除這些手動(dòng)粘貼的數(shù)據(jù)
步驟6:附動(dòng)態(tài)截圖
封裝一個(gè)分類:根據(jù)文件夾路徑畦木,計(jì)算文件夾的大小
利用NSFileManager,可以獲取文件夾砸泛,從而操縱這個(gè)文件夾十籍,你可以刪除這個(gè)文件夾中的內(nèi)容
-
系統(tǒng)底層不能夠計(jì)算文件夾的大小,只能計(jì)算文件的大小唇礁,因?yàn)槲募A沒有大小屬性勾栗,文件才有大小屬性,所以如果我們想要得到文件夾的大小盏筐,如何做呢围俘?
- 答: 利用NSFileManager遍歷出這個(gè)文件夾中的文件,將遍歷出的每個(gè)文件的大小相加机断,從而間接的得到文件夾的大小
想要永久的將圖片數(shù)據(jù)放入緩存中楷拳,必須放在沙盒的Library的Caches文件中,不要放在temp(臨時(shí)的文件夾吏奸,系統(tǒng)隨機(jī)刪除)欢揖,也不要放在Documents中,放在Documents中時(shí)候奋蔚,你請求蘋果審核你的app時(shí)她混,會(huì)被拒的,原因就是不能再Documents中放下載的緩存圖片
利用SDWebImage清除圖片緩存和利用NSFileManager清除圖片緩存
1.利用SDWebImage清除圖片緩存.
[[SDImageCache sharedImageCache] clearDisk];
2.利用NSFileManager清除圖片緩存
NSFileManager *mgr = [NSFileManager defaultManager];
// 緩存路徑
NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
// 刪除removeItemAtPath參數(shù)中的Caches目錄下的文件
[mgr removeItemAtPath:caches error:nil];
總結(jié):
1和2本質(zhì)是一樣的,因?yàn)閳D片緩存就是在Caches目錄下的泊碑,1的底層就是通過刪除Caches目錄下的圖片來解決圖片緩存的問題坤按,只不過沒有將緩存路徑暴露在外面罷了。1只能刪除存在Caches目錄下的圖片馒过,不能刪除存在tmp目錄下的視頻臭脓、音頻文件。
2是系統(tǒng)自帶的NSFileManager類腹忽,我們僅僅用了它其中的一個(gè)小小的功能解決圖片緩存問題的来累,因?yàn)閞emoveItemAtPath的參數(shù)代表的路徑是Caches路徑,所以實(shí)現(xiàn)了刪除Caches目錄下的圖片來解決圖片緩存的問題
2的功能局限窘奏,清除緩存的話嘹锁,只能清除存儲(chǔ)在Caches目錄下的圖片緩存,2的功能強(qiáng)大着裹,能刪除任何路徑下的緩存领猾,但是你必須先告訴NSFileManager類,指定刪除哪個(gè)路徑中的文件
圖片緩存和視頻、音頻緩存默認(rèn)的存儲(chǔ)路徑
- 圖片緩存存儲(chǔ)在沙盒的Library/Caches目錄下,如果我們沒有做刪除操作摔竿,圖片緩存就一直存在
- 視頻面粮、音頻存儲(chǔ)在沙盒的tmp/MediaCache目錄下,我們不需要做刪除操作拯坟,tmp目錄下的文件也會(huì)隨時(shí)刪除