使用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協議。
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM