日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Object 保存到文件中

發(fā)布時間:2023/12/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Object 保存到文件中 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

6月4日?Object 保存到文件中

?Q、 你添加一個新類到你的項目當中且你希望可以保存這個類的一個實例對象到磁盤文件 并在需要時從磁盤文件讀回到內存中

?A、 方案

?確保你的類遵循 NSCoding 協(xié)議且在類中實現(xiàn)了需要是實現(xiàn)的方法.不要擔心,在本節(jié) 的討論部分我會帶著你學習.

?D、 討論

?在 IOS SDK 中有兩個非常方便類來達到這個目的,在程序開發(fā)的術語中叫做編組,他們 是:

?NSKeyedArchiver 一個利用鍵值來歸檔或存儲對象或對象樹的類.對象的每一個值,我們稱為屬性,

?都能使用程序員選定的鍵值來歸檔.你將獲得一個歸檔文件,讓后你將可以保存你的

?數(shù)值通過所選定頂?shù)逆I值,此很像一個字典. NSKeyedUnarchiver

?此類進行與歸檔類相反的操作.它能很簡單地給你未歸檔的字典并要求你讀取值到 屬性中.

?為了讓歸檔及反歸檔工作正常,你需要確保需要歸檔及反歸檔的對象遵循 NSCoding 協(xié) 議.讓我們以一個簡單的 Person 類開始,如下是這個類的頭文件:

@interface Person : NSObject<NSCoding>

@property (nonatomic, copy) NSString *firstName;

@property (nonatomic, copy) NSString *lastName;

@end



如果現(xiàn)在你不寫此類的任何實現(xiàn)代碼且進行編譯,你將會考到編譯器拋出的警告,說你 沒有遵循NSCoding協(xié)議且沒有實現(xiàn)需要實現(xiàn)的方法.需要實現(xiàn)的方法如下:

?- (void)encodeWithCoder:(NSCoder *)aCoder 此方法將給你一個編碼器對象.此編碼器對象你可以像一個詞典那樣使用,可以簡單的通過你所選擇的鍵值 存儲數(shù)值進去.

?- (id)initWithCoder:(NSCoder *)aDecoder; 當你使用NSKeyedUnarchiver對象反歸檔你的對象時,此方法將被調用.你可以很簡單的通過傳遞進來的 NSCoder對象獲取你回的數(shù)值

?現(xiàn)在,基于上面的信息,我們實現(xiàn)我們的類:


#import "Person.h"


NSString *const kFirstNameKey = @"FirstNameKey";

NSString *const kLastNameKey = @"LastNameKey";


@implementation Person



-(void)encodeWithCoder:(NSCoder *)aCoder

{

? ? [aCoder encodeObject:self.firstName forKey:kFirstNameKey];

? ? [aCoder encodeObject:self.lastName forKey:kLastNameKey];

}


-(id)initWithCoder:(NSCoder *)aDecoder

{

? ? self = [super init];

? ? if (self != nil) {

? ? ? ? _firstName = [aDecoder decodeObjectForKey:kFirstNameKey];

? ? ? ? _lastName = [aDecoder decodeObjectForKey:kLastNameKey];

? ? }

? ? return self;

}



@end


NSString *const kFirstName = @"Steven";

NSString *const kLastName = @"Jobs";


/* Determine where we want to archive the object */

? ? NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"steveJobs"];

? ? /* Instantiate the object */

? ? Person *steveJobs = [[Person alloc] init];

? ? steveJobs.firstName = kFirstName;

? ? steveJobs.lastName = kLastName;

? ? /* Archive the object to the file */

?? NSData *data= [NSKeyedArchiver archivedDataWithRootObject:steveJobs];

? ? [data writeToFile:filePath atomically:YES];

?? ?

? ? NSData *readData = [NSData dataWithContentsOfFile:filePath];

?? Person *cloneOfSteveJobs = [NSKeyedUnarchiver unarchiveObjectWithData:readData];

?? ?

?? ?

? ? if ([cloneOfSteveJobs.firstName isEqualToString:kFirstName] &&

? ? ? ? [cloneOfSteveJobs.lastName isEqualToString:kLastName]){

? ? ? ? NSLog(@"Unarchiving worked"); } else {

? ? ? ? ? ? NSLog(@"Could not read the same values back. Oh no!");

? ? ? ? }



或者這樣


/* Determine where we want to archive the object */

NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"steveJobs.txt"];

/* Instantiate the object */

Person *steveJobs = [[Person alloc] init];

steveJobs.firstName = kFirstName;

steveJobs.lastName = kLastName;

/* Archive the object to the file */

[NSKeyedArchiver archiveRootObject:steveJobs toFile:filePath];

/* Now unarchive the same class into another object */

Person *cloneOfSteveJobs =

[NSKeyedUnarchiver unarchiveObjectWithFile:filePath];

/* Check if the unarchived object has the same first name and last name as the previously archived object */

if ([cloneOfSteveJobs.firstName isEqualToString:kFirstName] &&

? ? [cloneOfSteveJobs.lastName isEqualToString:kLastName]){

? ? NSLog(@"Unarchiving worked"); } else {

? ? ? ? NSLog(@"Could not read the same values back. Oh no!");

? ? }

總結

以上是生活随笔為你收集整理的Object 保存到文件中的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。