日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

使用NSKeyedArchiver归档

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

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

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

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

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

如果要歸檔我們自定義的對象,在part2會講解 part1 #import <Foundation/Foundation.h>int main(int argc, const char * argv[]) {@autoreleasepool {//---------------使用NSKeyedArchiver歸檔(存儲各種類型的對象數(shù)據(jù))-------------//將字典數(shù)據(jù)寫到文件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中的數(shù)據(jù)讀到字典對象并顯示出來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"];??

方法將創(chuàng)建的歸檔文件讀入執(zhí)行程序中。這個語句將指定的文件打開并讀取文件的內容,該文件必須是以前歸檔操作的結果。可以為文件指定完整路徑名或相對路徑名。

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

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

part2

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

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

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

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

@interface AddressCard : NSObject<NSCopying,NSCoding>

AddressCard.m中,實現(xiàn)NSCoding協(xié)議的編碼/解碼 方法:

#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.每一種基本數(shù)據(jù)類型,都有一個相應的編碼/解碼方法。 如:encodeObject方法與decodeObjectForKey方法,是成對出現(xiàn)的。 3.如果一個自定義的類A,作為另一個自定義類B的一個屬性存在;那么,如果要對B進行歸檔,那么,B要實現(xiàn)NSCoding協(xié)議。并且,A也要實現(xiàn)NSCoding協(xié)議。

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

總結

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

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