iOS開發UI篇—ios應用資料存放區方式(歸檔)

來源:互聯網
上載者:User

標籤:

一、簡單說明

在使用plist進行資料存放區和讀取,只適用於系統內建的一些常用類型才能用,且必須先擷取路徑相對麻煩;喜好設定(將所有的東西都儲存在同一個檔案夾下面,且主要用於儲存應用的設定資訊)歸檔:因為前兩者都有一個致命的缺陷,只能儲存常用的類型。歸檔可以實現把自訂的對象存放在檔案中。

二、程式碼範例

1.檔案結構

 

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 @end17 18 @implementation YYViewController19 20 - (void)viewDidLoad21 {22     [super viewDidLoad];23 }24 25 26 - (IBAction)saveBtnOnclick:(id)sender {27     //1.建立對象28     YYPerson *p=[[YYPerson alloc]init];29     [email protected]"文頂頂";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類

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 YYPerson12 13 // 當將一個自訂對象儲存到檔案的時候就會調用該方法14 // 在該方法中說明如何儲存自訂對象的屬性15 // 也就說在該方法中說清楚儲存自訂對象的哪些屬性16 -(void)encodeWithCoder:(NSCoder *)aCoder17 {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 *)aDecoder28 {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方法:

 

三、繼承類中的使用

建立一個學生類,讓這個類繼承自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 : YYPerson12 //增加一個體重屬性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 YYstudent12 13 //在子類中重寫這兩個方法14 - (void)encodeWithCoder:(NSCoder *)aCoder15 {16     [super encodeWithCoder:aCoder];17     NSLog(@"調用了YYStudent encodeWithCoder");18     [aCoder encodeFloat:self.weight forKey:@"weight"];19 }20 21 - (id)initWithCoder:(NSCoder *)aDecoder22 {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 @end18 19 @implementation YYViewController20 21 - (void)viewDidLoad22 {23     [super viewDidLoad];24 }25 26 27 - (IBAction)saveBtnOnclick:(id)sender {28     //1.建立對象29 //    YYPerson *p=[[YYPerson alloc]init];30 //    [email protected]"文頂頂";31 //    p.age=23;32 //    p.height=1.7;33     34     YYstudent *s=[[YYstudent alloc]init];35     [email protected]"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

點擊儲存按鈕和讀取按鈕後的列印輸出:

四、重要說明

1.儲存資料過程:

    //1.建立對象    YYstudent *s=[[YYstudent alloc]init];    [email protected]"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儲存的資料是直接顯示的,不安全。通過歸檔方法儲存的資料在檔案中開啟是亂碼的,更安全。

 

  

iOS開發UI篇—ios應用資料存放區方式(歸檔)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.