淺析iOS中的歸檔與反歸檔

今天我們要搞一搞iOS開發(fā)當中的歸檔和反歸檔淆珊,在進入正題之前,我們需要了解一下歸檔和反歸檔是干什么用的奸汇。

所謂歸檔施符,最通用的定義就是存儲有組織的數(shù)據(jù)往声,目的是為了長時間存放有組織的數(shù)據(jù)集。實際上就是將對象寫入文件當中戳吝。下面我們學習第一種歸檔與反歸檔方法

一浩销、
(1)歸檔

    NSArray *array = [NSArray arrayWithObjects:@1,@2,@3, nil];
    
    NSString *filePath = [NSHomeDirectory() stringByAppendingString:@"testFile.plist"];
    
    BOOL success = [NSKeyedArchiver archiveRootObject:array toFile:filePath];
    
    NSLog(@"%d",success);
    NSLog(@"%@",filePath);

通過打印BOOL值來判斷是否歸檔成功,也可以打印文件路徑听哭,通過Finder查找到文件夾來查看歸檔結(jié)果慢洋。

歸檔結(jié)果.png

(2)反歸檔

NSString *filePath = [NSHomeDirectory() stringByAppendingString:@"testFile.plist"];
    
    id array = [NSKeyedUnarchiver unarchiveObjectWithFile:filepath];
    
    NSLog(@"%@",array);

第一種方法比較簡單,但是只能存儲單個對象陆盘。
第二種方法可以將多個對象歸檔成一個文件普筹。

二、

(1)歸檔

NSMutableArray *array = [NSMutableArray arrayWithObjects:@"BigDragon",@"BigBiao",@"BigBaby", nil];
    NSMutableData *data = [NSMutableData data];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    //編碼
    [archiver encodeObject:array forKey:@"array"];
    [archiver encodeObject:@"Jason‘s friends" forKey:@"name"];
    
    //編碼完成之后隘马,對象已經(jīng)存儲到data之中太防。
    [archiver finishEncoding];
    
    NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"array.plist"];
    BOOL success = [data writeToFile:filePath atomically:YES];
    NSLog(@"%d",success);```

*(2)反歸檔*

NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"array.plist"];
//讀取歸檔數(shù)據(jù)
NSData *data = [[NSData alloc] initWithContentsOfFile:filePath];

//創(chuàng)建解歸檔對象,進行反歸檔
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];

//反歸檔
NSArray *array = [unarchiver decodeObjectForKey:@"array"];
NSLog(@"%@",array);

NSString *name = [unarchiver decodeObjectForKey:@"name"];
NSLog(@"%@",name);```

前兩種方法我們歸檔的都是系統(tǒng)給定的類祟霍,那么如何歸檔我們自定義的類呢杏头?

(三)歸檔自定義對象

美好的一天從創(chuàng)建一個Person類開始。 ——洋哥

遵從洋哥的教誨沸呐,讓我們先創(chuàng)建一個Person類吧醇王。

自定義類的歸檔需要遵守NSCoding協(xié)議,廢話不多說崭添,還是看代碼吧寓娩。

Person.h

#import <Foundation/Foundation.h>

// 給自定義類歸檔,首先要遵守NSCoding協(xié)議呼渣。
@interface Person : NSObject<NSCoding>

@property (nonatomic,strong) NSString *name;
@property (nonatomic,assign) NSInteger age;
@property (nonatomic,strong) NSString *gender;

- (NSString *)description;

@end```

*Person.m*
*.m文件中需要寫encodeWithCoder和initWithCoder兩個方法棘伴,分別在歸檔和反歸檔的時候調(diào)用。*

import "Person.h"

@implementation Person

// 歸檔方法

  • (void)encodeWithCoder:(NSCoder *)aCoder
    {
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeInteger:self.age forKey:@"age"];
    [aCoder encodeObject:self.gender forKey:@"gender"];
    }
    // 反歸檔方法

  • (instancetype)initWithCoder:(NSCoder *)aDecoder
    {
    self = [super init];

    if (self != nil) {
    self.name = [aDecoder decodeObjectForKey:@"name"];
    self.age = [aDecoder decodeIntegerForKey:@"age"];
    self.gender = [aDecoder decodeObjectForKey:@"gender"];
    }
    return self;
    }

  • (NSString *)description
    {
    NSString *string = [NSString stringWithFormat:@"%@,%ld,%@",self.name,self.age,self.gender];
    return string;
    }
    @end```

main函數(shù)
寫完P(guān)erson的.h 和 .m 文件之后屁置,接下來的就是在main函數(shù)中的操作了焊夸,我這里用的是ViewController,效果是一樣的蓝角。

#import "ViewController.h"
#import "Person.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    Person *person = [[Person alloc]init];
    
    person.name = @"BigBaby";
    person.age = 16;
    person.gender = @"男";
    
    // 歸檔阱穗,調(diào)用歸檔方法
    NSString *filePath = [NSHomeDirectory() stringByAppendingString:@"person.plist"];
    BOOL success = [NSKeyedArchiver archiveRootObject:person toFile:filePath];
    NSLog(@"%d",success);
    
    // 反歸檔,調(diào)用反歸檔方法
    Person *per = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    NSLog(@"%@",per);
    
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}```
*通過打印反歸檔解出來的BOOL值和對象per使鹅,可以驗證是否歸檔和反歸檔成功揪阶。*
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市患朱,隨后出現(xiàn)的幾起案子鲁僚,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冰沙,死亡現(xiàn)場離奇詭異侨艾,居然都是意外死亡,警方通過查閱死者的電腦和手機拓挥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門蒋畜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人撞叽,你說我怎么就攤上這事〔辶洌” “怎么了愿棋?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長均牢。 經(jīng)常有香客問我糠雨,道長,這世上最難降的妖魔是什么徘跪? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任甘邀,我火速辦了婚禮,結(jié)果婚禮上垮庐,老公的妹妹穿的比我還像新娘松邪。我一直安慰自己,他們只是感情好哨查,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布逗抑。 她就那樣靜靜地躺著,像睡著了一般寒亥。 火紅的嫁衣襯著肌膚如雪邮府。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天溉奕,我揣著相機與錄音褂傀,去河邊找鬼。 笑死加勤,一個胖子當著我的面吹牛仙辟,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播胸竞,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼欺嗤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了卫枝?” 一聲冷哼從身側(cè)響起煎饼,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎校赤,沒想到半個月后吆玖,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體筒溃,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年沾乘,在試婚紗的時候發(fā)現(xiàn)自己被綠了怜奖。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡翅阵,死狀恐怖歪玲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情掷匠,我是刑警寧澤滥崩,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站讹语,受9級特大地震影響钙皮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜顽决,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一短条、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧才菠,春花似錦茸时、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至进每,卻和暖如春汹粤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背田晚。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工嘱兼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贤徒。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓芹壕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親接奈。 傳聞我的和親對象是個殘疾皇子踢涌,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,770評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)序宦,斷路器睁壁,智...
    卡卡羅2017閱讀 134,633評論 18 139
  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,928評論 6 13
  • 第一步:降級CFE 如果固件版本是246、260的,需要先用 K3降級CFE助手 降級CFE潘明,如果是217版本行剂,可...
    熊孩子2017閱讀 4,769評論 0 50
  • 文/董改正 不久前,各種媒體突現(xiàn)“香菇藍瘦”一詞钳降,深令我等資訊滯后者惶惑厚宰,問訊度娘后才知道原來是一個廣西小伙子被分...
    桃花島上的桃花源閱讀 523評論 0 0