NSCoding協(xié)議 與 NSUerDefaults

數(shù)據(jù)持久性的方式 (三類)

 1.  NSKeyedArchiver - 對象歸檔

 2.  NSUerDefaults, 屬性列表

 3.  SQLite數(shù)據(jù)庫 和 Core Data 數(shù)據(jù)庫 

以上 區(qū)別 SQlite數(shù)據(jù)庫和Core Data 的主要用于存儲大型的數(shù)據(jù), NSUerDefaults 則多用于存儲個人偏好設置!

  NSCode  

  1. 用于數(shù)據(jù)歸檔就是指將對象寫入本地保存在硬盤中, 當再次重新打開程序的時候, 程序啟動的時候, 新分配的對象可以解碼之前保存的描述, 然后恢復到之前運行時候的狀態(tài)!。也稱:對象序列化、對象持久化。

  2. 這種以某種存儲形式可以使自定義對象持久化, 或者將這種對象從一個地方傳輸?shù)搅硪坏胤?  可用于數(shù)據(jù)流的傳輸!!
 所以, 它主要那個用于小型得直接存儲一些自定義的類對象! 和一些簡單數(shù)據(jù)!

歸檔方式

注意: 要使用歸檔, 必須要簽NSCodingNSMutableCoding協(xié)議

1. 對Foundation庫中對象進行歸檔 (系統(tǒng)自帶的類, 已經簽好了)

@interface  NSString :NSObject  <NSCoping, NSMutableCoping, NSSecureCoding>

NSSercureCoding 表示已經簽了協(xié)議了!

2. 自定義對象進行歸檔(需要自己實現(xiàn)歸檔協(xié)議,NSCoding)

 系統(tǒng)的方法挺人性化, 考慮到了好多因素! 

例子 1:

NSArray *arr =@[@"111",@"222",@"333"]; // 定義一個數(shù)組 
// 取一個地址
NSArray *documents =NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);

NSString  *path = [documents[0] stringByAppendingPathComponent: @" multiPersonInfo.plist" ];

// 歸檔

[NSKeyedArchiver archiveRootObject:arr toFile:path]; //直接存入本地

 NSArray *newArr = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; // 反歸檔, 直接取出!!

例子 2: 用于自定義的類
要簽協(xié)議,并且使用 NSCoding 的兩個方法!
- (void)encodeWithCoder:(NSCoder)aCoder 和
- (id)initWithCoder:(NSCoder
)aDecoder 分別用于歸檔和反歸檔

定義一個類!

 boss.h
#import <Foundation/Foundation.h>
@interfaceboss :NSObject <NSCoding>
@property(nonatomic,retain)NSString*name;
@property(nonatomic,assign)NSIntegernumber;
@property(nonatomic,retain)NSString*sex;
@end



boss.m文件
#import"boss.h"
@implementationboss
- (void)encodeWithCoder:(NSCoder*)aCoder

 {//編碼的方法,將數(shù)據(jù)編碼成可以寫入本地的狀態(tài)
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeObject:self.sex forKey:@"sex"];
[aCoder encodeInteger:self.number forKey:@"number"];
}

 - (id)initWithCoder:(NSCoder*)aDecoder
 {//解碼方法,從本地讀取數(shù)據(jù),重新創(chuàng)建對象進行初始化
 self= [superinit];
if(self) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.sex = [aDecoder decodeObjectForKey:@"sex"];
self.number= [aDeco derdecodeIntegerForKey:@"number"];
}
return self;
}

調用:

boss*bosss = [[boss alloc]init];
bosss.name = @"老王";
boss.number = 30;
bosss.sex=@"unknown";
NSString *bossPath = [paths tringByAppendingPathComponent:@"boss.aa"];

[NSKeyedArchiver archiveRootObject: bosss  toFile: bossPath];

反歸檔類重新產生一個新對象

 boss *bossReturn = [NSKeyed  UnarchiverunarchiveObjectWithFile:bossPath];
NSLog(@"%@", bossReturn.name);

但當為單個對象的時候, 可以調用一下方法, 使用archiveRootObject:toFile:方法可以將一個對象直接寫入到一個文件中,但有時候可能想將多個對象寫入到同一個文件,那么可以使用NSData來歸檔對象,NSData可以為一些數(shù)據(jù)提供臨時存儲空間,以便隨后寫入文件,或者存放從磁盤讀取的文件內容??梢允褂?code>[NSMutableData data] 創(chuàng)建可變數(shù)據(jù)空間

多個對象歸檔

定義第一對象 boss *bosss1 = [[boss alloc]init];
bosss1.name = @"老王";
bosss1.number = 30;
bosss1.sex = @"unknown";

定義第二個對象
boss *bosss2 = [[boss alloc]init]; 
bosss2.name = @"老王";
bosss2.number = 30;
bosss2.sex = @"unknown";
NSArrar *setArray = [NSArray  arrayWithObjects:bosss1, bosss2,nil];//學生對象數(shù)組,里面包含bosss1 和 bosss2兩個對象;
NSData*bossData = [NSKeyedUnarchiver ArchiverarchivedDataWithRootObject: stuArray];//歸檔
NSLog(@"data = %@",stuData); 

然后再把bossData寫入本地!!!
當然也不必須轉換成 NSData, 也可以存儲。
NSArray *bossArray2 =[NSKeyedUnarchiver unarchiveObjectWithData: bossData];//逆歸檔

若是數(shù)組存儲的是自定義類的對象, 用writeToFile:<#(NSString *)#> atomically:<#(BOOL)#>寫入本地是不可以的!!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,622評論 30 472
  • 下面是我最近兩年學習OC中的一些基礎知識,對于學習OC基礎知識的人可能有些幫助,拿出來分享一下,還是那句話不喜勿噴...
    小小趙紙農閱讀 2,822評論 1 7
  • 數(shù)據(jù)持久化的相關知識 四種將數(shù)據(jù)持久化存儲到iOS文件系統(tǒng)的機制: plist 對象歸檔 iOS的嵌入式關系數(shù)據(jù)庫...
    melouverrr閱讀 718評論 0 0
  • 1、 沙盒概念基本介紹 iOS 應用程序只能在該 app 的文件系統(tǒng)中讀取。這個默認的 app 文件系統(tǒng)就是我們說...
    Laughingg閱讀 2,935評論 2 10
  • 文/圍城不是城 我準備下樓倒垃圾的時候,發(fā)現(xiàn)在家門口有一個本子。 本子是我喜歡的天藍色,不過上面全是劃痕和污漬,讓...
    圍城不是城閱讀 1,383評論 7 6

友情鏈接更多精彩內容