iOS開發UI篇—ios應用數據存儲方式(歸檔) ios
1、簡單說明安全
在使用plist進行數據存儲和讀取,只適用於系統自帶的一些經常使用類型才能用,且必須先獲取路徑相對麻煩;app
偏好設置(將全部的東西都保存在同一個文件夾下面,且主要用於存儲應用的設置信息)atom
歸檔:由於前二者都有一個致命的缺陷,只能存儲經常使用的類型。歸檔能夠實現把自定義的對象存放在文件中。code
2、代碼示例對象
1.文件結構blog
2.代碼示例繼承
YYViewController.m文件開發
1 // 2 // YYViewController.m 3 // 02-歸檔 4 // 5 // Created by apple on 14-6-7. 6 // Copyright (c) 2014年 itcase. All rights reserved. 7 // 8 9 #import "YYViewController.h" 10 #import "YYPerson.h" 11 12 @interface YYViewController () 13 - (IBAction)saveBtnOnclick:(id)sender; 14 - (IBAction)readBtnOnclick:(id)sender; 15 16 @end 17 18 @implementation YYViewController 19 20 - (void)viewDidLoad 21 { 22 [super viewDidLoad]; 23 } 24 25 26 - (IBAction)saveBtnOnclick:(id)sender { 27 //1.建立對象 28 YYPerson *p=[[YYPerson alloc]init]; 29 p.name=@"文頂頂"; 30 p.age=23; 31 p.height=1.7; 32 33 //2.獲取文件路徑 34 NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]; 35 NSString *path=[docPath stringByAppendingPathComponent:@"person.yangyang"]; 36 NSLog(@"path=%@",path); 37 38 //3.將自定義的對象保存到文件中 39 [NSKeyedArchiver archiveRootObject:p toFile:path]; 40 41 } 42 43 - (IBAction)readBtnOnclick:(id)sender { 44 //1.獲取文件路徑 45 NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]; 46 NSString *path=[docPath stringByAppendingPathComponent:@"person.yangyang"]; 47 NSLog(@"path=%@",path); 48 49 //2.從文件中讀取對象 50 YYPerson *p=[NSKeyedUnarchiver unarchiveObjectWithFile:path]; 51 NSLog(@"%@,%d,%.1f",p.name,p.age,p.height); 52 } 53 @end
新建一個person類string
YYPerson.h文件
1 // 2 // YYPerson.h 3 // 02-歸檔 4 // 5 // Created by apple on 14-6-7. 6 // Copyright (c) 2014年 itcase. All rights reserved. 7 // 8 9 #import <Foundation/Foundation.h> 10 11 // 若是想將一個自定義對象保存到文件中必須實現NSCoding協議 12 @interface YYPerson : NSObject<NSCoding> 13 14 //姓名 15 @property(nonatomic,copy)NSString *name; 16 //年齡 17 @property(nonatomic,assign)int age; 18 //身高 19 @property(nonatomic,assign)double height; 20 @end
YYPerson.m文件
1 // 2 // YYPerson.m 3 // 02-歸檔 4 // 5 // Created by apple on 14-6-7. 6 // Copyright (c) 2014年 itcase. All rights reserved. 7 // 8 9 #import "YYPerson.h" 10 11 @implementation YYPerson 12 13 // 當將一個自定義對象保存到文件的時候就會調用該方法 14 // 在該方法中說明如何存儲自定義對象的屬性 15 // 也就說在該方法中說清楚存儲自定義對象的哪些屬性 16 -(void)encodeWithCoder:(NSCoder *)aCoder 17 { 18 NSLog(@"調用了encodeWithCoder:方法"); 19 [aCoder encodeObject:self.name forKey:@"name"]; 20 [aCoder encodeInteger:self.age forKey:@"age"]; 21 [aCoder encodeDouble:self.height forKey:@"height"]; 22 } 23 24 // 當從文件中讀取一個對象的時候就會調用該方法 25 // 在該方法中說明如何讀取保存在文件中的對象 26 // 也就是說在該方法中說清楚怎麼讀取文件中的對象 27 -(id)initWithCoder:(NSCoder *)aDecoder 28 { 29 NSLog(@"調用了initWithCoder:方法"); 30 //注意:在構造方法中須要先初始化父類的方法 31 if (self=[super init]) { 32 self.name=[aDecoder decodeObjectForKey:@"name"]; 33 self.age=[aDecoder decodeIntegerForKey:@"age"]; 34 self.height=[aDecoder decodeDoubleForKey:@"height"]; 35 } 36 return self; 37 } 38 @end
3.打印效果和兩個重要的錯誤提示
點擊保存按鈕和讀取按鈕,成功打印結果以下:
關於不實現兩個協議方法的錯誤提示:
-(void)encodeWithCoder:(NSCoder *)aCoder方法:
-(id)initWithCoder:(NSCoder *)aDecoder方法:
3、繼承類中的使用
新建一個學生類,讓這個類繼承自Preson這個類,增長一個體重的屬性。
YYstudent.h文件
1 // 2 // YYstudent.h 3 // 02-歸檔 4 // 5 // Created by apple on 14-6-7. 6 // Copyright (c) 2014年 itcase. All rights reserved. 7 // 8 9 #import "YYPerson.h" 10 11 @interface YYstudent : YYPerson 12 //增長一個體重屬性 13 @property(nonatomic,assign) double weight; 14 @end
YYstudent.m文件
1 // 2 // YYstudent.m 3 // 02-歸檔 4 // 5 // Created by apple on 14-6-7. 6 // Copyright (c) 2014年 itcase. All rights reserved. 7 // 8 9 #import "YYstudent.h" 10 11 @implementation YYstudent 12 13 //在子類中重寫這兩個方法 14 - (void)encodeWithCoder:(NSCoder *)aCoder 15 { 16 [super encodeWithCoder:aCoder]; 17 NSLog(@"調用了YYStudent encodeWithCoder"); 18 [aCoder encodeFloat:self.weight forKey:@"weight"]; 19 } 20 21 - (id)initWithCoder:(NSCoder *)aDecoder 22 { 23 if (self = [super initWithCoder:aDecoder]) { 24 NSLog(@"調用了YYstudent initWithCoder"); 25 self.weight = [aDecoder decodeFloatForKey:@"weight"]; 26 } 27 return self; 28 } 29 @end
YYViewController.m文件
1 // 2 // YYViewController.m 3 // 02-歸檔 4 // 5 // Created by apple on 14-6-7. 6 // Copyright (c) 2014年 itcase. All rights reserved. 7 // 8 9 #import "YYViewController.h" 10 #import "YYPerson.h" 11 #import "YYstudent.h" 12 13 @interface YYViewController () 14 - (IBAction)saveBtnOnclick:(id)sender; 15 - (IBAction)readBtnOnclick:(id)sender; 16 17 @end 18 19 @implementation YYViewController 20 21 - (void)viewDidLoad 22 { 23 [super viewDidLoad]; 24 } 25 26 27 - (IBAction)saveBtnOnclick:(id)sender { 28 //1.建立對象 29 // YYPerson *p=[[YYPerson alloc]init]; 30 // p.name=@"文頂頂"; 31 // p.age=23; 32 // p.height=1.7; 33 34 YYstudent *s=[[YYstudent alloc]init]; 35 s.name=@"wendingding"; 36 s.age=23; 37 s.height=1.7; 38 s.weight=62; 39 //2.獲取文件路徑 40 NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]; 41 NSString *path=[docPath stringByAppendingPathComponent:@"person.yangyang"]; 42 NSLog(@"path=%@",path); 43 44 //3.將自定義的對象保存到文件中 45 // [NSKeyedArchiver archiveRootObject:p toFile:path]; 46 [NSKeyedArchiver archiveRootObject:s toFile:path]; 47 48 } 49 50 - (IBAction)readBtnOnclick:(id)sender { 51 //1.獲取文件路徑 52 NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]; 53 NSString *path=[docPath stringByAppendingPathComponent:@"person.yangyang"]; 54 NSLog(@"path=%@",path); 55 56 //2.從文件中讀取對象 57 // YYPerson *p=[NSKeyedUnarchiver unarchiveObjectWithFile:path]; 58 // NSLog(@"%@,%d,%.1f",p.name,p.age,p.height); 59 YYstudent *s=[NSKeyedUnarchiver unarchiveObjectWithFile:path]; 60 NSLog(@"%@,%d,%.1f,%f",s.name,s.age,s.height,s.weight); 61 } 62 @end
點擊保存按鈕和讀取按鈕後的打印輸出:
4、重要說明
1.保存數據過程:
//1.建立對象 YYstudent *s=[[YYstudent alloc]init]; s.name=@"wendingding"; s.age=23; s.height=1.7; s.weight=62; //2.獲取文件路徑 NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]; NSString *path=[docPath stringByAppendingPathComponent:@"person.yangyang"]; NSLog(@"path=%@",path); //3.將自定義的對象保存到文件中 [NSKeyedArchiver archiveRootObject:s toFile:path];
2.讀取數據過程:
//1.獲取文件路徑 NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]; NSString *path=[docPath stringByAppendingPathComponent:@"person.yangyang"]; //2.從文件中讀取對象 YYstudent *s=[NSKeyedUnarchiver unarchiveObjectWithFile:path];
3.遵照NSCoding協議,並實現該協議中的兩個方法。
4.若是是繼承,則子類必定要重寫那兩個方法。由於person的子類在存取的時候,會去子類中去找調用的方法,沒找到那麼它就去父類中找,因此最後保存和讀取的時候新增長的屬性會被忽略。須要先調用父類的方法,先初始化父類的,再初始化子類的。
5.保存數據的文件的後綴名能夠隨意命名。
6.經過plist保存的數據是直接顯示的,不安全。經過歸檔方法保存的數據在文件中打開是亂碼的,更安全。