1东囚、使用 writeToFile:atomically: 方法
(1)該方法是一次性向文件中寫入內(nèi)容,本次寫入會覆蓋文件中原來的內(nèi)容。
(2)方法解析:
???????? 使用要存儲的數(shù)據(jù)對象 調(diào)用該方法嘀倒,該方法有兩個參數(shù):
???????? para1:要寫入的路徑(目標(biāo)文件路徑)
???????? para2 :BOOL型。若為no局冰,則直接寫入目標(biāo)文件路徑测蘑;若為yes,則先寫到一個臨時的文件中康二,然后重命名后移至目標(biāo)路徑中碳胳,這樣若在寫入過程中出現(xiàn)了系統(tǒng)崩潰等問題,可以保證最終寫入目標(biāo)路徑文件的完整性(一般設(shè)為yes)沫勿。
(3)可以存儲的數(shù)據(jù)類型為:???????? 基本數(shù)據(jù)類型挨约、系統(tǒng)的引用(對象)類型,而自定義的對象類型不能使用該方法存儲产雹。例:NSArray *array = @[@"你好"];
??? [array writeToFile:destinationFilePath atomically:YES];
2诫惭、NSUserDefaults
(1)描述
???????? 這是一個單例類,直接操作沙盒中的Library中的Preferences中的一個名為本應(yīng)用的BundleID的plist文件蔓挖。
(2)相關(guān)操作
????? //首先獲取NSUserDefaults對象
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
1)寫數(shù)據(jù):
????? 可存儲的數(shù)據(jù)類型:字符串夕土、數(shù)組、字典瘟判、data怨绣、整型、浮點(diǎn)型拷获、BOOL型等
//字符串
[userDefaults setObject:@"111" forKey:@"1"];
//字典
NSDictionary *dic = @{@"222":@"2"};
[userDefaults setObject:dic forKey:@"2"];
//數(shù)組
NSArray *array = @[@"333",@"3333"];
[userDefaults setObject:array forKey:@"3"];
????? 注意:UserDefaults設(shè)置數(shù)據(jù)時,不是立即寫入,?是根據(jù)時間戳定時地把緩存中的數(shù)據(jù)寫入本地磁盤梨熙。所以調(diào)?了set方法之后數(shù)據(jù)有可能還沒有寫入磁盤應(yīng)用程序就終止了。出現(xiàn)以上問題,可以通過調(diào)用synchronize方法強(qiáng)制寫入刀诬,方法如下:
[userDefaults synchronize];
(2)取數(shù)據(jù):
//字符串
??? NSString *str = [userDefaults objectForKey:@"1"];
//字典??? NSDictionary *dic = [userDefaults objectForKey:@"2"];
//數(shù)組
NSArray *array = [userDefaults objectForKey:@"3"];
//布爾型??? BOOL isOk = [userDefaults boolForKey:@"4"];
(3)修改數(shù)據(jù)
//根據(jù)鍵值刪除對應(yīng)的對象??? [userDefaults removeObjectForKey:@"2"];
3咽扇、NSKeyedAchiever
????? (1)將自定義類對象存儲到本地的過程叫對象序列化 從本地讀出自定義類對象的過程叫對象反序列化 也有人將序列化稱為歸檔邪财。
????? (2)想要存儲自定義類對象,則該類要實(shí)現(xiàn)NSCoding協(xié)議以及該協(xié)議的兩個方法://編碼方法 aCoder編碼器 在編碼時 會將對象的屬性也進(jìn)行編碼- (void)encodeWithCoder:(NSCoder *)aCoder{?? ?[aCoder encodeObject:_name forKey:@"name"];
}
//解碼方法 aDecoder解碼器 在解碼時 會將對象的屬性頁進(jìn)行解碼- (id)initWithCoder:(NSCoder *)aDecoder{?? ?self.name = [aDecoder decodeObjectForKey:@"name"];}????? (3)同時质欲,若你想自定義 打印該對象的內(nèi)容树埠,則需要重寫它的description方法,只需在重寫的方法中自定義你想打印的內(nèi)容即可嘶伟,這里不再贅述怎憋。
????? (4)使用NSKeyedArchiver(序列化)/NSKeyedUnarchiver(反序列化)的步驟分別如下:
1)序列化步驟:
? A、創(chuàng)建可變數(shù)據(jù) 用于存儲序列化后的數(shù)據(jù) NSMutableData? *data? B九昧、根據(jù)data 創(chuàng)建序列化器? C绊袋、編碼? D、結(jié)束編碼? E铸鹰、將data寫入沙盒? F癌别、釋放通過 alloc 創(chuàng)建的對象?注:序列化時會調(diào)用對象實(shí)現(xiàn)的NSCoding協(xié)議中的encodeWithCoder方法 對每個對象進(jìn)行編碼。
具體實(shí)例:(自定義類:People)
??? NSArray *array = @[people1,people2,people3,people4,people5];??? NSMutableData *data1 = [[NSMutableData alloc] init];??? NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data1];??? [archiver encodeObject:array];??? [archiver finishEncoding];??? BOOL isOK = [data1 writeToFile:filePath atomically:YES];??? [archiver release];??? [data1 release]; ??????
2)反序列化步驟:??? A蹋笼、從本地取出你存儲的數(shù)據(jù)?? B展姐、若該數(shù)據(jù)不空,轉(zhuǎn)至3?? C剖毯、創(chuàng)建反序列化器?? D圾笨、解碼 并用 數(shù)組 接收(因?yàn)槟阒来鎯Φ氖菙?shù)組)?? E、結(jié)束解碼
具體實(shí)例:
??? NSData *data2 = [NSData dataWithContentsOfFile:filePath];??? if (data2)
??? {????????? NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data2];????????? NSArray *arr2 = [unarchiver decodeObject];?????? ?? [unarchiver finishDecoding];
??? }
想學(xué)習(xí)更多關(guān)于ios開發(fā)方面的知識請加qq:2296575155