將各種類型的對象存儲到文件中,而不僅僅是字符串、數組和字典類型,有一種更靈活的方法。就是利用NSKeyedAarchiver類創建帶鍵(keyed)的檔案來完成。
Mac OS X從版本10.2開始支持帶鍵的檔案。在此之前,要使用NSArchiver類創建連續的(sequential)歸檔。連續的歸檔需要完全按照寫入時的順序讀取歸檔中的數據。
在帶鍵的歸檔中,每個歸檔字段都有一個名稱。歸檔某個對象時,會為它提供一個名稱,即鍵。從歸檔中檢索該對象時,是根據這個鍵來檢索的。這樣可以按照任意的順序將對象寫入歸檔並進行檢索。另外,如果向類添加了新的實例變量或刪除了實例變量,程序也可以進行處理。
注意:默認情況下,只能對NSDate, NSNumber, NSString, NSArray, or NSDictionary來進行歸檔。
#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
- (void)encodeWithCoder:(NSCoder *)aCoder;
- (id)initWithCoder:(NSCoder *)aDecoder;
@interface AddressCard : NSObject<NSCopying,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];
}