使用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归档的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu 2871 Memory Cont
- 下一篇: php数组常用函数汇总