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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

使用NSKeyedArchiver归档

發布時間:2024/1/17 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用NSKeyedArchiver归档 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

將各種類型的對象存儲到文件中,而不僅僅是字符串、數組和字典類型,有一種更靈活的方法。就是利用NSKeyedAarchiver類創建帶鍵(keyed)的檔案來完成。

Mac OS X從版本10.2開始支持帶鍵的檔案。在此之前,要使用NSArchiver類創建連續的(sequential)歸檔。連續的歸檔需要完全按照寫入時的順序讀取歸檔中的數據。

在帶鍵的歸檔中,每個歸檔字段都有一個名稱。歸檔某個對象時,會為它提供一個名稱,即鍵。從歸檔中檢索該對象時,是根據這個鍵來檢索的。這樣可以按照任意的順序將對象寫入歸檔并進行檢索。另外,如果向類添加了新的實例變量或刪除了實例變量,程序也可以進行處理。

注意:默認情況下,只能對NSDate, NSNumber, NSString, NSArray, or NSDictionary來進行歸檔。

如果要歸檔我們自定義的對象,在part2會講解 part1 #import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {@autoreleasepool {//---------------使用NSKeyedArchiver歸檔(存儲各種類型的對象數據)-------------//將字典數據寫到文件glossary.archive中NSDictionary *glossary = [NSDictionary dictionaryWithObjectsAndKeys:@"A class defined so other class can inherit from it.",@"abstract class",@"To implement all the methods defined in a protocol.",@"adopt",@"Storing an object for later use.",@"archiving",nil];[NSKeyedArchiver archiveRootObject:glossary toFile:@"glossary.archive"];//將文件glossary.archive中的數據讀到字典對象并顯示出來NSDictionary *readglossary = [NSKeyedUnarchiver unarchiveObjectWithFile:@"glossary.archive"];for(NSString *key in readglossary)NSLog(@"%@: %@",key,[readglossary objectForKey:key]);}return 0; }

其中,

    [NSKeyedArchiver?archiveRootObject:glossary?toFile:@"glossary.archive"];??

將字典glossary寫入到文件glossary.archive中。可以為該文件指定任何路徑名。在本例中,文件被寫入當前目錄下。

之后,又通過

    NSDictionary?*readglossary?=?[NSKeyedUnarchiver?unarchiveObjectWithFile:@"glossary.archive"];??

方法將創建的歸檔文件讀入執行程序中。這個語句將指定的文件打開并讀取文件的內容,該文件必須是以前歸檔操作的結果??梢詾槲募付ㄍ暾窂矫蛳鄬β窂矫?。

在顯示結果之后,可以簡單的通過枚舉其內容來驗證恢復是否成功。

原文http://blog.csdn.net/enuola/article/details/7802371

part2

但是,當我們對自己定義的對象進行“編碼/解碼”操作時,卻需要實現NSCoding協議的相關方法來告訴程序如何來“編碼/解碼”我們自己的對象! NSCoding協議的方法:

- (void)encodeWithCoder:(NSCoder *)aCoder;

- (id)initWithCoder:(NSCoder *)aDecoder;

那么,我們就對類實現“編碼/解碼”協議: 在AddressCard.h中,申明實現NSCoding協議:

@interface AddressCard : NSObject<NSCopying,NSCoding>

AddressCard.m中,實現NSCoding協議的編碼/解碼 方法:

#pragma mark- NSCoding

- (void)encodeWithCoder:(NSCoder *)aCoder{

? ? [aCoder encodeObject:self.name forKey:@"AddressCard_name"];

? ? [aCoder encodeObject:self.email forKey:@"AddressCard_email"];

? ? [aCoder encodeInt32:self.salary forKey:@"AddressCard_salary"];

?

}

- (id)initWithCoder:(NSCoder *)aDecoder{

? ? _name=[[aDecoder decodeObjectForKey:@"AddressCard_name"] retain];

? ? _email=[[aDecoder decodeObjectForKey:@"AddressCard_email"] retain];

? ? _salary=[aDecoder decodeInt32ForKey:@"AddressCard_salary"];

? ? return self;

?

}

這樣,我們就能夠歸檔自己定義的類對象。

NSString *filePhyName=[filePath stringByAppendingPathComponent:@"ObjectFile"];

? ? BOOL isSuccess=NO;

? ? isSuccess= [NSKeyedArchiver archiveRootObject:objArray toFile:filePhyName];

? ? if (isSuccess) {

? ? ? ? NSLog(@"Success");

? ? }else{

? ? ? ? NSLog(@"False");

? ? }

?? ?

? ? // 反歸檔

? ? NSMutableArray *myObj=[NSKeyedUnarchiver unarchiveObjectWithFile:filePhyName];

? ? for (AddressCard *theCard in myObj) {

? ? ? ? [theCard print];

? ? }

從輸出可以看到,歸檔成功! 歸檔需要注意的是: 1.同一個對象屬性,編碼/解碼的key要相同! 2.每一種基本數據類型,都有一個相應的編碼/解碼方法。 如:encodeObject方法與decodeObjectForKey方法,是成對出現的。 3.如果一個自定義的類A,作為另一個自定義類B的一個屬性存在;那么,如果要對B進行歸檔,那么,B要實現NSCoding協議。并且,A也要實現NSCoding協議。

轉載于:https://www.cnblogs.com/xiaobaizhu/p/4011332.html

總結

以上是生活随笔為你收集整理的使用NSKeyedArchiver归档的全部內容,希望文章能夠幫你解決所遇到的問題。

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