數(shù)據(jù)存儲(chǔ)方式绊起、沙盒路徑(文件documents精拟,tmp,app虱歪,Library)蜂绎、FMDB


沙箱模型的有四個(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
打印开呐。.png
寫入到plist文件.png
  • 方式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ò)的解決辦法


92-01.png

歸檔征冷、解檔


92-05.png
92-06.png

注意歸檔\解檔 和 對象轉(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)截圖

59-41.gif

封裝一個(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í)刪除

iOS緩存之 內(nèi)存緩存與磁盤緩存的區(qū)別

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末但金,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子郁季,更是在濱河造成了極大的恐慌冷溃,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梦裂,死亡現(xiàn)場離奇詭異似枕,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)年柠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門凿歼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人冗恨,你說我怎么就攤上這事答憔。” “怎么了掀抹?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵虐拓,是天一觀的道長。 經(jīng)常有香客問我傲武,道長蓉驹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任揪利,我火速辦了婚禮态兴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疟位。我一直安慰自己瞻润,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布甜刻。 她就那樣靜靜地躺著绍撞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪罢吃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天昭齐,我揣著相機(jī)與錄音尿招,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛就谜,可吹牛的內(nèi)容都是我干的怪蔑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼丧荐,長吁一口氣:“原來是場噩夢啊……” “哼缆瓣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起虹统,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤弓坞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后车荔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體渡冻,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年忧便,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了族吻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡珠增,死狀恐怖超歌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蒂教,我是刑警寧澤巍举,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站悴品,受9級特大地震影響禀综,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜苔严,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一定枷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧届氢,春花似錦欠窒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至寂祥,卻和暖如春荐虐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背丸凭。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工福扬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腕铸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓铛碑,卻偏偏與公主長得像狠裹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子汽烦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容