#pragma mark---目錄---
?1、兩個(gè)目錄:
①、沙盒 (有三個(gè)文件夾?docments temp library)
②、bundle?在運(yùn)行的時(shí)候 只能讀數(shù)據(jù) 寫不進(jìn)去數(shù)據(jù)
?2、讀取路徑方式
?bundle目錄:[NSBundle mainBundle]
?根目錄:NSHomeDirectory()
?tmp:NSTemporaryDirectory()
?①、查找路徑數(shù)組
NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask,?YES)
?②、找到指定路徑
?取第一個(gè)或最后一個(gè)元素
?Documents:NSDocumentDirectory
?library:NSLibraryDirectory
?Caches:NSCachesDirectory
?讀寫文件
?數(shù)組 字典 字符串
?write
?ContentsOfFile
?[數(shù)組對(duì)象?writeToFile:path atomically:YES]
?[字典對(duì)象?writeToFile:path atomically:YES]
?[字符串對(duì)象?writeToFile:path atomically:YESencoding:NSUTF8StringEncoding error:nil]
?[NSArray arrayWithContentsOfFile:path]
?[NSDictionary dictionaryWithContentsOfFile:path]
[NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]
?#pragma mark---正文---
?數(shù)據(jù)持久化:把閃存上的數(shù)據(jù)以文件的形式保存下來(保存到磁盤)它的目的是為了保存數(shù)據(jù)
?1、plist
?2、NSUserDefaults
?3、歸檔?NSCoding?序列化
?4、sqlite(數(shù)據(jù)庫(kù))
?5、coreData(蘋果專有數(shù)據(jù)庫(kù))
?路徑:文件存儲(chǔ)的位置
?ios專有的沙盒機(jī)制:bandBox? IOS的應(yīng)用程序里,每一個(gè)應(yīng)用程序只能夠讀取寫入本應(yīng)用程序的沙盒目錄
?沙盒的路徑->應(yīng)用程序根目錄
?NSLog(@"%@",NSHomeDirectory());打印根目錄
沙盒目錄的組成:
?1、Documents:可以開放讀取寫入的權(quán)限->里面所有的文件都可以導(dǎo)出或者拖進(jìn)去->不要放一些隱私的文件
?怎樣打開??
? ? info.plist文件里面添加?Application supports iTunes file sharing?把這個(gè)key對(duì)應(yīng)的值改成YES就可以分享Documents目錄
?2、Library:存放配置信息或者數(shù)據(jù)庫(kù)資源文件
?3、tmp:臨時(shí)文件存儲(chǔ)的地方 隔一段時(shí)間會(huì)清除一次(可以設(shè)置)->不能放重要的文件(數(shù)據(jù)庫(kù))
?bundle目錄:應(yīng)用程序右鍵顯示包內(nèi)容的目錄 不允許應(yīng)用程序在運(yùn)行的時(shí)候?qū)懭肴魏螖?shù)據(jù)
?#pragma mark---查找各個(gè)目錄路徑的方式:---
?根目錄:NSHomeDirectory()
?bundle目錄:[NSBundle mainBundle]
?tmp目錄: NSTemporaryDirectory()
?#pragma mark---查找特殊的幾個(gè)目錄---
?Library目錄、Documents目錄、NSCachesDirectory:
?(1)、找到根目錄--NSHomeDirectory()?拼接到Library目錄
?①通過拼接字符串拼接路徑
NSString *path = [NSHomeDirectory() stringByAppendingString:@"/Library"];
NSLog(@"%@",path);
?②專門用于拼接路徑的方式
?路徑是以“/”來區(qū)分的 如果用拼接字符串的方式拼接路徑就必須加“/”
?如果用拼接路徑的方式拼接路徑就不能加“/”
NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Library"];
NSLog(@"%@",path);
?(2)、查找用戶應(yīng)用程序的范圍 查找Library目錄
?記:查找目錄會(huì)得到一個(gè)數(shù)組?Search(查找)
?① 先找到某個(gè)路徑的數(shù)組
NSArray *pathList = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask,?YES);
?? ? NSSearchPathForDirectoriesInDomains(要查找的路徑,?要搜索的區(qū)域范圍,?是不是允許獲得擴(kuò)展的目錄);
?② 獲得數(shù)組里面的第一個(gè)或者最后一個(gè)目錄(只有一個(gè)元素),就是要查找的目錄
?NSString *path3 = [pathList lastObject];
NSLog(@"%@",path3);
?#pragma mark---寫入讀取文件:---
?字典、數(shù)組都有讀取寫入文件的方法
?1、寫入到plist文件里面
?2、
?數(shù)組讀取文件
?arrayWithContentsOfFile:(NSString *)path
?initWithContentsOfFile:(NSString *)path
?數(shù)組寫入內(nèi)容
?- (BOOL)writeToFile:文件路徑?atomically:(BOOL)useAuxiliaryFile
**atomically?如果設(shè)置成YES?不會(huì)直接寫入到指定文件 先寫入到一個(gè)臨時(shí)文件 暫存一下 當(dāng)寫入完畢才會(huì)存入到指定文件 如果遇到(斷電 閃退 來電話...)就會(huì)刪除臨時(shí)文件 不去寫入到指定文件 防止寫入數(shù)據(jù)不完整 在使用的時(shí)候出現(xiàn)崩潰
?如果設(shè)置成NO?不管任何情況 都會(huì)寫入
?字典讀取文件
?dictionaryWithContentsOfFile:(NSString *)path
?initWithContentsOfFile:(NSString *)path
?字典寫入文件
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile
?字符串讀取文件
? initWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error
?stringWithContentsOfFile:(NSString *)path encoding:(NSStringEncoding)enc error:(NSError **)error
NSString *str = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
?字符串寫入文件
- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile encoding:(NSStringEncoding)enc error:(NSError **)error
?NSError *error;
[content writeToFile:path atomically:YESencoding:NSUTF8StringEncoding error:&error];
--------------------------------------------------------------------
#pragma mark---歸檔---
*歸檔->數(shù)據(jù)持久化的方式->加密(把文件加密《不是把數(shù)據(jù)加密》)
*歸檔分為:
?1、存儲(chǔ)數(shù)據(jù)(編碼、序列化、歸檔過程)
?2、讀取數(shù)據(jù)(解碼、反序列化、解歸檔過程)
*可以歸檔的對(duì)象:必須遵守歸檔協(xié)議(NSSecureCoding遵守NSCoding)、實(shí)現(xiàn)協(xié)議方法
*除了NSObject未實(shí)現(xiàn)歸檔協(xié)議 其他實(shí)現(xiàn)了協(xié)議的類 都可以歸檔(UIViewController、UIView...)
歸檔類名:NSKeyedArchiver
解歸檔類名:NSKeyedUnarchiver
*歸檔、解歸檔 都是通過key來實(shí)現(xiàn)的
*在歸檔、解歸檔的時(shí)候?key一定要對(duì)應(yīng)(盡量和對(duì)象名相同)
#pragma mark-----歸檔的步驟--------
1、寫存儲(chǔ)歸檔文件的路徑
NSArray *searchList = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask,?YES);
?*歸檔文件的尾綴盡量用?.archiver
NSString *path = [[searchList lastObject]stringByAppendingPathComponent:@"list.archiver"];
2、準(zhǔn)備要?dú)w檔的數(shù)據(jù)
NSArray *list =?@[@{@"name":@"小明",?@"age":@(18),?@"height":@(18.5)}];
3、開始?xì)w檔
*把一個(gè)Object(支持歸檔)的數(shù)據(jù) 以歸檔的形式存儲(chǔ)到指定位置
?+ (BOOL)archiveRootObject:(id)rootObject toFile:(NSString *)path;
*支持歸檔協(xié)議的對(duì)象 系統(tǒng)幫忙對(duì)他進(jìn)行了編碼
?BOOL?isSuccess = [NSKeyedArchiver archiveRootObject:list toFile:path];
?if?(isSuccess) {
NSLog(@"%@",path);
? ? }
#pragma mark-----解歸檔的步驟------
1、歸檔文件路徑
2、開始解歸檔
?+ (nullable id)unarchiveObjectWithFile:(NSString *)path
? ? NSArray *list = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
#pragma mark---NSData二進(jìn)制的類---
*NSData?二進(jìn)制的類 可以把文件或者數(shù)據(jù)轉(zhuǎn)成二進(jìn)制的對(duì)象
#pragma mark---多種數(shù)據(jù)歸檔步驟---
1、存儲(chǔ)路徑
NSArray *searchList = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,?YES);
?NSString?*path = [[searchList lastObject]stringByAppendingPathComponent:@"user.archiver"];
2、初始化一個(gè)可變的二進(jìn)制對(duì)象?**NSMutableData?同時(shí)準(zhǔn)備要?dú)w檔的數(shù)據(jù)
NSString *name =?@"mary";
?NSInteger?age =?18;
?float?height =?172.5;
?NSMutableData?*Data = [NSMutableData?data];
3、歸檔等待寫入數(shù)據(jù)的二進(jìn)制對(duì)象(要把二進(jìn)制對(duì)象寫入到文件)->讓歸檔對(duì)象幫他寫入
?? ? NSKeyedArchiver *arc = [[NSKeyedArchiver alloc]initForWritingWithMutableData:Data];
4、使用歸檔對(duì)象 對(duì)要?dú)w檔的數(shù)據(jù)進(jìn)行編碼(同時(shí)寫入到二進(jìn)制對(duì)象-系統(tǒng)幫咱們操作)(編碼結(jié)束就會(huì)把編碼后的數(shù)據(jù)寫入二進(jìn)制對(duì)象)
*編碼:encode?解碼:decode
*要用對(duì)應(yīng)的數(shù)據(jù)類型進(jìn)行編碼
[arc encodeObject:name forKey:@"name"];
[arc encodeInteger:age forKey:@"age"];
[arc encodeFloat:height forKey:@"height"];
5、編碼結(jié)束
*把編碼之后數(shù)據(jù)寫入到二進(jìn)制對(duì)象
?? ? [arc finishEncoding];
6、把二進(jìn)制對(duì)象存儲(chǔ)到指定位置
?BOOL?isSuccess = [Data writeToFile:path atomically:YES];
?if?(isSuccess) {
NSLog(@"%@",path);
#pragma mark---多種解歸檔---
?**decode?解碼
- (instancetype)initForReadingWithData:(NSData *)data
1、歸檔文件路徑
2、使用data讀取數(shù)據(jù) 準(zhǔn)備解歸檔data里面的數(shù)據(jù)
? ? NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:[NSData dataWithContentsOfFile:path]];
3、解歸檔數(shù)據(jù) 用對(duì)應(yīng)的數(shù)據(jù)類型接收
?NSString?*name = [unarchiver decodeObjectForKey:@"name"];
?NSInteger?age = [unarchiver decodeIntegerForKey:@"age"];
?float?height = [unarchiver decodeFloatForKey:@"height"];
?NSLog(@"%@? %ld? %f",name,age,height);
#pragma mark---*自定義歸檔*---
自定義歸檔->有些數(shù)據(jù)不能歸檔->讓他遵守歸檔協(xié)議(NSCoding)->
?歸檔、解歸檔都與第一種方式相同
userModel *user = [[userModel alloc]init];
user.name =?@"江兒";
user.age =?18;
user.height =?165.5;
?NSString?*path = [NSHomeDirectory()?stringByAppendingPathComponent:@"user.archiver"];
?BOOL?isOK = [NSKeyedArchiver archiveRootObject:user toFile:path];
?if?(isOK) {
NSLog(@"%@",path);
? ? }
?userModel?*userMode= [NSKeyedUnarchiverunarchiveObjectWithFile:path];
?NSLog(@"%@ %ld %f",userMode.name,userMode.age,userMode.height);
當(dāng)在歸檔位置(viewController中)調(diào)用[NSKeyedArchiver archiveRootObject:XXX toFile:XXX];?會(huì)自動(dòng)調(diào)用encodeWithCoder:這個(gè)代理方法
使用**歸檔方法對(duì)對(duì)象歸檔的時(shí)候 會(huì)調(diào)用這個(gè)方法
- (void)encodeWithCoder:(NSCoder *)aCoder{
? ? aCoder就是系統(tǒng)傳過來的NSKeyedArchiver實(shí)例化出來的對(duì)象
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeInteger:self.age forKey:@"age"];
[aCoder encodeFloat:self.height forKey:@"height"];
}
使用**解歸檔方法對(duì)對(duì)象解歸檔的時(shí)候 會(huì)調(diào)用這個(gè)方法
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder{
?只要是構(gòu)造方法先把創(chuàng)建對(duì)象的方法補(bǔ)全
?//self = [super init];
?//if (self) {
?//}
?//return self;
?self?= [super?init];
?if?(self) {
?當(dāng)使用解歸檔方法的時(shí)候 系統(tǒng)會(huì)自動(dòng)調(diào)用initWithCoder:這個(gè)方法?系統(tǒng)會(huì)幫咱們創(chuàng)建一個(gè)對(duì)象
?之前的對(duì)象的數(shù)據(jù)保存在 歸檔文件里面
?在解歸檔的時(shí)候 還原數(shù)據(jù) 并且把還原的數(shù)據(jù)賦值給這個(gè)對(duì)象->現(xiàn)在這個(gè)對(duì)象的數(shù)據(jù)跟原來歸檔的數(shù)據(jù)是一樣的
?self.name = [aDecoder decodeObjectForKey:@"name"];
?self.age = [aDecoder decodeIntegerForKey:@"age"];
?self.height = [aDecoder decodeFloatForKey:@"height"];
? ? }
?return self;
}