知識
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們在追求其視覺表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營銷的便利,運(yùn)營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏壧峁┍憬莸闹С郑?
iOS學(xué)習(xí)筆記
發(fā)表時(shí)間:2020-10-19
發(fā)布人:葵宇科技
瀏覽次數(shù):44
在iOS進(jìn)修過程中,有時(shí)刻須要保持用戶數(shù)據(jù),比如登錄信息、用戶的設(shè)制揭捉項(xiàng)等,這時(shí)刻就須要進(jìn)修數(shù)據(jù)持久化操作,本節(jié)重要進(jìn)修iOS數(shù)據(jù)持久化相干的常識。
數(shù)據(jù)持久化的方法有四種:
1).寫入plist文件(屬性列表)
2).偏好設(shè)置
3).歸檔(NSKeyedArchiver)
4).NSData
下面分別舉例解釋四種方法的實(shí)用處合以及用法。
1. 寫入plist文件(屬性列表)
1.1 plist可以存儲哪些數(shù)據(jù)
屬性列表是一種XML格式的文件,拓展名為plist
如不雅對象是NSString、NSDictionary、NSArray、NSData、NSNumber等類型,就可以應(yīng)用writeToFile:atomically:辦法直接將對象寫到屬性列表文件中。
因?yàn)閜list文件的root只有Array和Dictionary兩種類型,所以最好只保持它們對應(yīng)數(shù)據(jù)類型的數(shù)據(jù)。
[img]http://img.blog.csdn.net/20150106121855385?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hlbnlibG9n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
比如當(dāng)你存儲字符串類型的數(shù)據(jù)的時(shí)刻,Type就為空了。
[img]http://img.blog.csdn.net/20150106121934375?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hlbnlibG9n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
1.2 若何存儲
#pragma mark - 存儲數(shù)據(jù) - (IBAction)btnSaveData_Click:(UIButton *)sender { NSString *str = @"hello"; NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"test_str.plist"]; BOOL result = [str writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:nil]; if (result) { NSLog(@"存儲數(shù)據(jù)成功"); } else { NSLog(@"存儲數(shù)據(jù)掉?。?quot;); } }
法度榜樣運(yùn)行結(jié)不雅如下:
[img]http://img.blog.csdn.net/20150106122018484?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hlbnlibG9n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
主動(dòng)生成的文件:
[img]http://img.blog.csdn.net/20150106122114225?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hlbnlibG9n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
留意:plist不克不及存儲自定義對象類型!
<span style="color:#000000;">#pragma mark - 存儲數(shù)據(jù) - (IBAction)btnSaveData_Click:(UIButton *)sender { // 文件的沙河路徑 NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"test_obj.plist"]; // 創(chuàng)建Student對象 CYStudent *stu = [[CYStudent alloc]init]; stu.name = @"zhangsan"; stu.age = 18; NSArray *arrTmp = @[stu]; BOOL result = [arrTmp writeToFile:filePath atomically:YES]; if (result) { NSLog(@"存儲數(shù)據(jù)成功"); } else { NSLog(@"存儲數(shù)據(jù)掉??!"); } }</span>法度榜樣運(yùn)行結(jié)不雅如下:
[img]http://img.blog.csdn.net/20150106122201493?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hlbnlibG9n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
1.3 plist文件的存儲與攫取過程
[img]http://img.blog.csdn.net/20150106122241289?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hlbnlibG9n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
2. 偏好設(shè)置
2.1 應(yīng)用處景
很多iOS應(yīng)用都支撐偏好設(shè)置,比如保存用戶名、暗碼、字體大年夜小等設(shè)置,iOS供給了一套標(biāo)準(zhǔn)的解決籌劃來為應(yīng)用參加偏好設(shè)置功能
每個(gè)應(yīng)用都有個(gè)NSUserDefaults實(shí)例,經(jīng)由過程它來存取偏好設(shè)置。比如,保存用戶名、字體大年夜小、是否主動(dòng)登錄。
2.2 若何應(yīng)用
登錄成功后保存數(shù)據(jù):
[[NSUserDefaults standardUserDefaults]setObject:self.txtAccount.text forKey:@"account"]; [[NSUserDefaults standardUserDefaults]setObject:self.txtPWD.text forKey:@"pwd"]; [[NSUserDefaults standardUserDefaults]setBool:self.swchRememberPWD.on forKey:@"isRememberPWD"]; [[NSUserDefaults standardUserDefaults]setBool:self.swchAutoLogin.on forKey:@"isAutoLogin"];
再次登錄時(shí)攫取數(shù)據(jù):
// 獲取偏好設(shè)置中的數(shù)據(jù)
self.txtAccount.text = [[NSUserDefaults standardUserDefaults]objectForKey:@"account"]; self.swchAutoLogin.on = [[NSUserDefaults standardUserDefaults]boolForKey:@"isAutoLogin"]; self.swchRememberPWD.on = [[NSUserDefaults standardUserDefaults]boolForKey:@"isRememberPWD"]; self.txtPWD.text = [[NSUserDefaults standardUserDefaults]objectForKey:@"pwd"];
留意:UserDefaults設(shè)置數(shù)據(jù)時(shí),不是急速寫入,而是根據(jù)時(shí)光戳準(zhǔn)時(shí)地把緩存中的數(shù)據(jù)寫入本地磁盤。所聲調(diào)用了set辦法之后數(shù)據(jù)有可能還沒有寫入磁盤應(yīng)用法度榜樣就終止了。出現(xiàn)以上問題,可以經(jīng)由過程調(diào)用synchornize辦法強(qiáng)迫寫入
[defaults synchornize];
3. 歸檔(NSKeyedArchiver)
3.1 應(yīng)用處合
如不雅對象是NSString、NSDictionary、NSArray、NSData、NSNumber等類型,可以直接用NSKeyedArchiver進(jìn)行歸檔和恢復(fù)
不是所有的對象都可以直接用這種辦法進(jìn)行歸檔,只有遵守了NSCoding協(xié)定的對象才可以
NSCoding協(xié)定有2個(gè)辦法:
1)encodeWithCoder:
每次歸檔對象時(shí),都邑調(diào)用這個(gè)辦法。一般在這個(gè)辦法瑯綾擎指定若何歸檔對象中的每個(gè)實(shí)例變量,可以應(yīng)用encodeObject:forKey:辦法歸檔實(shí)例變量
2)initWithCoder:
每次大年夜文件中恢復(fù)(解碼)對象時(shí),都邑調(diào)用這個(gè)辦法。一般在這個(gè)辦法瑯綾擎指定若何解碼文件中的數(shù)據(jù)為對象的實(shí)例變量,可以應(yīng)用decodeObject:forKey辦法解碼實(shí)例變量
3.2 若何應(yīng)用
1> 自定義實(shí)體類
@interface CYContact : NSObject /** 姓名 */ @property (nonatomic,copy) NSString *name; /** 德律風(fēng) */ @property (nonatomic,copy) NSString *phone; @end
2> 實(shí)現(xiàn)NSCoding協(xié)定辦法
#pragma mark - NSCoding協(xié)定辦法 /* Encodes the receiverusing a given archiver 經(jīng)由過程一個(gè)給定的archiver把消息接收者進(jìn)行編碼。 當(dāng)接收到encodeObject消息的時(shí)刻,類終端encodeWithCoder辦法被調(diào)用。 */ - (void)encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeObject:_name forKey:CYNameKey]; [aCoder encodeObject:_phone forKey:CYPhoneKey]; } /* Returns an objectinitialized from data in a given unarchiver. (required) 年腋荷瑣給定unarchiver的數(shù)據(jù)中返回一個(gè)初始化對象。 */ - (id)initWithCoder:(NSCoder *)aDecoder { if (self = [super init]) { _name = [aDecoder decodeObjectForKey:CYNameKey]; _phone = [aDecoder decodeObjectForKey:CYPhoneKey]; } return self; } /* Returnsa new instance that’s a copy of the receiver 返回消息接收者的一個(gè)復(fù)制的新實(shí)例。 */ - (id)copyWithZone:(NSZone *)zone { CYContact *copy =
3> 歸檔
[NSKeyedArchiver archiveRootObject:self.contacts toFile:CYFilePath];
4> 接檔
self.contacts = [NSKeyedUnarchiver unarchiveObjectWithFile:CYFilePath];
5> 留意點(diǎn)
如不雅父類也遵守了NSCoding協(xié)定,請留意:
? 應(yīng)當(dāng)在encodeWithCoder:辦法中加上一句[super encodeWithCode:encode];確保持續(xù)的實(shí)例變量也能被編碼,即也能被歸檔
? 應(yīng)當(dāng)在initWithCoder:辦法中加上一句self = [super initWithCoder:decoder];確保持續(xù)的實(shí)例變量也能被解碼,即也能被恢復(fù)
4. NSData
4.1 應(yīng)用處合
應(yīng)用archiveRootObject:toFile:辦法可以將一個(gè)對象直接寫入到一個(gè)文件中,但有時(shí)刻可能想將多個(gè)對象寫入到同一個(gè)文件中,那么 就要應(yīng)用NSData來進(jìn)行歸檔對象
NSData可認(rèn)為一些數(shù)據(jù)供給臨時(shí)存儲空間,以便隨后寫入文件,或者存放大年夜磁盤攫取的文件內(nèi)容。可以應(yīng)用[NSMutableData data]創(chuàng)建 可變數(shù)據(jù)空間
[img]http://img.blog.csdn.net/20150106122333393?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2hlbnlibG9n/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
注:黑色箭頭表示將對象歸檔到文件中,紅色箭頭表示大年夜文件中恢復(fù)對象
4.2 若何應(yīng)用
#pragma mark - 存儲數(shù)據(jù) - (IBAction)btnSaveData_Click:(UIButton *)sender { // NSData-歸檔2個(gè)Person對象到同一文件中 // 實(shí)例化對象 CYStudent *stu1 = [CYStudent studentWithName:@"zhangsan" age:18]; CYStudent *stu2 = [CYStudent studentWithName:@"lisi" age:20]; // 新建一塊可變數(shù)據(jù)區(qū) NSMutableData *data = [NSMutableData data]; // 將數(shù)據(jù)區(qū)連接到一個(gè)NSKeyedArchiver對象 NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; // 開端存檔對象,存檔的數(shù)據(jù)都邑存儲到NSMutableData中 [archiver encodeObject:stu1 forKey:@"stu1"]; [archiver encodeObject:stu2 forKey:@"stu2"]; // 存檔完畢(必定要調(diào)用這個(gè)辦法) [archiver finishEncoding]; NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"datas.data"]; // 將存檔的數(shù)據(jù)寫入文件 BOOL result = [data writeToFile:path atomically:YES]; if (result) { NSLog(@"存儲數(shù)據(jù)成功"); } else { NSLog(@"存儲數(shù)據(jù)掉?。?quot;); } } #pragma mark - 攫取數(shù)據(jù) - (IBAction)btnReadData_Click:(UIButton *)sender { // NSData-大年夜同一文件中恢復(fù)2個(gè)Person對象 // 大年夜文件中攫取數(shù)據(jù) NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"datas.data"]; NSData *data = [NSData dataWithContentsOfFile:path]; // 根據(jù)數(shù)據(jù),解析成一個(gè)NSKeyedUnarchiver對象 NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; CYStudent *stu1 = [unarchiver decodeObjectForKey:@"stu1"]; CYStudent *stu2 = [unarchiver decodeObjectForKey:@"stu2"]; // 恢復(fù)完畢 [unarchiver finishDecoding]; NSLog(@"%@",stu1); NSLog(@"%@",stu2); } #pragma mark - 應(yīng)用歸檔實(shí)現(xiàn)深復(fù)制 - (IBAction)btnDeepCopy_Click:(UIButton *)sender { // 比如對一個(gè)CYStudent對象進(jìn)行深復(fù)制 // 臨時(shí)存儲stu1的數(shù)據(jù) CYStudent *stu1 = [CYStudent studentWithName:@"zhangsan" age:18]; NSData *data = [NSKeyedArchiver archivedDataWithRootObject:stu1]; // 解析data,生成一個(gè)新的Person對象 CYStudent *stu2 = [NSKeyedUnarchiver unarchiveObjectWithData:data]; // 分別打印內(nèi)存地址 NSLog(@"stu1:%p", stu1); // stu1:0x7bdb32b0 NSLog(@"stu2:%p", stu2); // stu2:0x7bdb6b80 }
相關(guān)案例查看更多
相關(guān)閱讀
- 出入小程序
- 網(wǎng)站建設(shè)案例
- 報(bào)廢車管理
- 云南網(wǎng)站建設(shè)首選
- 云南網(wǎng)站開發(fā)
- flex
- 云南網(wǎng)站制作哪家好
- uniapp開發(fā)小程序
- 云南衛(wèi)視小程序
- 云南建設(shè)廳網(wǎng)站首頁
- 關(guān)鍵詞快速排名
- 小程序定制
- 軟件定制
- 云南小程序商城
- 退款
- 汽車報(bào)廢管理系統(tǒng)
- 報(bào)廢車拆解軟件
- 云南網(wǎng)站設(shè)計(jì)
- 云南網(wǎng)站建設(shè)特性
- 云南網(wǎng)站建設(shè)公司
- 小程序的開發(fā)公司
- 云南電商網(wǎng)站建設(shè)
- 小程序表單
- 保山小程序開發(fā)
- 云南小程序開發(fā)費(fèi)用
- 百度排名
- 開發(fā)制作小程序
- 小程序制作
- 云南網(wǎng)站建設(shè)百度官方
- 汽車回收管理