oc 学习(归档)

来源:互联网 发布:coc武神升级数据 编辑:程序博客网 时间:2024/04/30 17:00

归档是一个过程,用某种格式来保存一个或多个对象,以便以后还原这些对象。通常, 这个过程包括将多个对象写入文件中,以便以后读取。

属性列表归档和带键值归档

使用xml属性列表进行归档

如果对象时NSString , NSDictionary, NSArray, NSData 或者NSNumber, 可以使用writeToFile:atomically, 该方法可以使用XML属性列表的格式写出数据。

#import <Foundation/Foundation.h>#import "Fraction.h"int main(int argc, const char * argv[]) {    @autoreleasepool {        NSDictionary *glossary = [NSDictionary dictionaryWithObjectsAndKeys:                                  @"A class defined so other classes can inberit form it",                                  @"abstract class",                                  @"To implement all the methods defined in a protocal",                                  @"adopt",                                  @"Storing an object for later use.",                                  @"archiving",                                  nil];        if ([glossary writeToFile:@"/Users/lee/Desktop/practice/learn02/glossary" atomically:YES] == NO) {            NSLog(@"Save to file failed!");        }    }    return 0;}
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict>        <key>abstract class</key>        <string>A class defined so other classes can inberit form it</string>        <key>adopt</key>        <string>To implement all the methods defined in a protocal</string>        <key>archiving</key>        <string>Storing an object for later use.</string></dict></plist>~                                                                               ~                                                                               ~                                                                               ~                                                                               ~                                                                               ~                                                                               ~                                                                               ~                                                                               ~                                                                               ~                                                                               "glossary" 12L, 446C

atomically 参数被设为yes表示希望首先将字典写入临时备份文件中一旦成功,将把最终数据转移到名为glossary的制定文件中。

读取

#import <Foundation/Foundation.h>#import "Fraction.h"int main(int argc, const char * argv[]) {    @autoreleasepool {        NSDictionary *glossary;        glossary = [NSDictionary dictionaryWithContentsOfFile:@"/Users/lee/Desktop/practice/learn02/glossary"];        for (NSString *key in glossary) {            NSLog(@"%@ : %@", key, [glossary objectForKey:key]);        }    }    return 0;}

使用NSKeyedArchiver归档

要使用其创建连续的归档。连续的归档需要完全按照写入时的顺序读取归档中的数据。

#import <Foundation/Foundation.h>#import "Fraction.h"int main(int argc, const char * argv[]) {    @autoreleasepool {        NSDictionary *glossary = [NSDictionary dictionaryWithObjectsAndKeys:                                  @"A class defined so other classes can inberit form it",                                  @"abstract class",                                  @"To implement all the methods defined in a protocal",                                  @"adopt",                                  @"Storing an object for later use.",                                  @"archiving",                                  nil];        [NSKeyedArchiver archiveRootObject:glossary toFile:@"/Users/lee/Desktop/practice/learn02/glossary.archive"];        }    return 0;}
leedeMacBook-Pro:learn02 lee$ vi glossary.archivebplist00Ô^A^B^C^D^E^F!"X$versionX$objectsY$archiverT$top^R^@^A<86> ©^G^H^U^V^W^X^Y^Z^[U$nullÓ^K^L^P^TWNS.keysZNS.objectsV$class£^M^N^O<80>^B<80>^C<80>^D£^Q^R^S<80>^E<80>^F<80>^G<80>^HUadoptYarchiving^abstract class_^P2To implement all the methods defined in a protocal_^P Storing an object for later use._^P4A class defined so other classes can inberit form itÒ^\^]^^^_Z$classnameX$classes\NSDictionary¢^^ XNSObject_^P^ONSKeyedArchiverÑ#$Troot<80>^A^@^H^@^Q^@^Z^@#^@-^@2^@7^@A^@G^@N^@V^@a^@h^@l^@n^@p^@r^@v^@x^@z^@|^@~^@<84>^@<8e>^@<9d>^@Ò^@õ^A,^A1^A<^AE^AR^AU^A^^Ap^As^Ax^@^@^@^@^@^@^B^A^@^@^@^@^@^@^@%^@^@^@^@^@^@^@^@^@^@^@^@^@^@^Az

写入:

#import <Foundation/Foundation.h>#import "Fraction.h"int main(int argc, const char * argv[]) {    @autoreleasepool {        NSDictionary *glossary;        glossary = [NSKeyedUnarchiver unarchiveObjectWithFile:@"/Users/lee/Desktop/practice/learn02/glossary.archive"];        for(NSString *key in glossary){            NSLog(@"%@ : %@", key, [glossary objectForKey:key]);        }    }    return 0;}

以上方法并不能归档自定义类。如果要自定义类归档,则必须完成 encodeWithCoder:方法和initWithCoder:方法的实现,
encodeWithCoder: 告知归档程序如何进行归档编码initWithCoder: 每次从指定的类解码对象

////  main.m//  learn02////  Created by lee on 15/12/26.//  Copyright © 2015年 ltybrp. All rights reserved.//#import <Foundation/Foundation.h>#import "Fraction.h"@interface AddressCard: NSObject <NSCoding>@property (copy, nonatomic) NSString *name, *email;-(void) setName:(NSString *)theName andEmail : (NSString *) theEmail;-(NSComparisonResult) compareNames :(id) element;-(void) print;-(void) assignName:(NSString *) theName andEmail :(NSString *) theEmail;@end@implementation AddressCard@synthesize name;@synthesize email;-(void) encodeWithCoder:(NSCoder *)aCoder{   // [super encodeWithCoder: aCoder];    [aCoder encodeObject:name forKey:@"AddressCardName"];    [aCoder encodeObject:email forKey:@"AddressCardEmail"];}-(id) initWithCoder:(NSCoder *)aDecoder{   // self = [super initWithCoder: aDecoder];    name = [aDecoder decodeObjectForKey:@"AddressCardName"];    email = [aDecoder decodeObjectForKey:@"AddressCardEmail"];    return self;}-(void) assignName:(NSString *)theName andEmail:(NSString *)theEmail{    name = theName;    email = theEmail;}-(void) setName:(NSString *)theName andEmail : (NSString *) theEmail{    name = theName;    email = theEmail;}-(void) print{    NSLog(@"%@ : %@", self.name, self.email);}-(NSComparisonResult) compareNames:(id)element{    if ([name compare:[element name]] != NSOrderedSame) {        return [name compare:[element name]];    } else        return [email compare:[element email]];}@endint main(int argc, const char * argv[]) {    @autoreleasepool {        AddressCard *card1 = [[AddressCard alloc]init];        AddressCard *card2 = [[AddressCard alloc]init];        AddressCard *card3 = [[AddressCard alloc]init];        NSString *name1 = @"A";        NSString *ad1 = @"4";        NSString *name2 = @"A";        NSString *ad2 = @"2";        NSString *name3 = @"B";        NSString *ad3 = @"2";        [card1 setName:name1 andEmail:ad1];        [card2 setName:name2 andEmail:ad2];        [card3 setName:name3 andEmail:ad3];        NSMutableArray *array = [NSMutableArray arrayWithObjects:card1,card2,card3, nil];        [array sortUsingComparator:^NSComparisonResult(id objc1, id objc2){            if ([[objc1 name] compare:[objc2 name]] != NSOrderedSame) {                return [[objc2 name]compare:[objc2 name]];            } else                return [[objc1 email]compare:[objc2 email]];        }];       // NSLog(@"%@",[array description]);        if([NSKeyedArchiver archiveRootObject:array toFile:@"/Users/lee/Desktop/practice/learn02/glossary"] == NO){            NSLog(@"archiving failed");        }        NSMutableArray *w_array = [[NSMutableArray alloc]init];        w_array = [NSKeyedUnarchiver unarchiveObjectWithFile:@"/Users/lee/Desktop/practice/learn02/glossary"];        for(id node in w_array){            [node print];        }    }    return 0;}
 使用NSData创建自定义档案 ////  main.m//  learn02////  Created by lee on 15/12/26.//  Copyright © 2015年 ltybrp. All rights reserved.//#import <Foundation/Foundation.h>#import "Fraction.h"@interface AddressCard: NSObject <NSCoding>@property (copy, nonatomic) NSString *name, *email;-(void) setName:(NSString *)theName andEmail : (NSString *) theEmail;-(NSComparisonResult) compareNames :(id) element;-(void) print;-(void) assignName:(NSString *) theName andEmail :(NSString *) theEmail;@end@implementation AddressCard@synthesize name;@synthesize email;-(void) encodeWithCoder:(NSCoder *)aCoder{   // [super encodeWithCoder: aCoder];    [aCoder encodeObject:name forKey:@"AddressCardName"];    [aCoder encodeObject:email forKey:@"AddressCardEmail"];}-(id) initWithCoder:(NSCoder *)aDecoder{   // self = [super initWithCoder: aDecoder];    name = [aDecoder decodeObjectForKey:@"AddressCardName"];    email = [aDecoder decodeObjectForKey:@"AddressCardEmail"];    return self;}-(void) assignName:(NSString *)theName andEmail:(NSString *)theEmail{    name = theName;    email = theEmail;}-(void) setName:(NSString *)theName andEmail : (NSString *) theEmail{    name = theName;    email = theEmail;}-(void) print{    NSLog(@"%@ : %@", self.name, self.email);}-(NSComparisonResult) compareNames:(id)element{    if ([name compare:[element name]] != NSOrderedSame) {        return [name compare:[element name]];    } else        return [email compare:[element email]];}@endint main(int argc, const char * argv[]) {    @autoreleasepool {        AddressCard *card1 = [[AddressCard alloc]init];        AddressCard *card2 = [[AddressCard alloc]init];        AddressCard *card3 = [[AddressCard alloc]init];        NSString *name1 = @"A";        NSString *ad1 = @"4";        NSString *name2 = @"A";        NSString *ad2 = @"2";        NSString *name3 = @"B";        NSString *ad3 = @"2";        [card1 setName:name1 andEmail:ad1];        [card2 setName:name2 andEmail:ad2];        [card3 setName:name3 andEmail:ad3];        NSMutableArray *array = [NSMutableArray arrayWithObjects:card1,card2,card3, nil];        [array sortUsingComparator:^NSComparisonResult(id objc1, id objc2){            if ([[objc1 name] compare:[objc2 name]] != NSOrderedSame) {                return [[objc2 name]compare:[objc2 name]];            } else                return [[objc1 email]compare:[objc2 email]];        }];        /*编码        NSMutableData *dataArea = [NSMutableData data];        NSKeyedArchiver *archiver;        int a = 100;        archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:dataArea];        [archiver encodeObject:array forKey:@"AddressData"];        [archiver encodeInt:a forKey:@"Int"];        [archiver finishEncoding];        */        //解码        if([dataArea  writeToFile:@"/Users/lee/Desktop/practice/learn02/glossary" atomically:YES] == NO){            NSLog(@"archiving failed");        }        NSKeyedUnarchiver* unachiver=[[NSKeyedUnarchiver alloc] initForReadingWithData:dataArea];        NSMutableData *undata = [NSMutableData dataWithContentsOfFile:@"/Users/lee/Desktop/practice/learn02/glossary"];        if(!undata){            NSLog(@"Cant't read back rachive file");        }        NSMutableArray *unarray = [unachiver decodeObjectForKey: @"AddressData"];       int b = [unachiver decodeIntForKey:@"Int"];        [unachiver finishDecoding];        for(id node in unarray){           [node print];        }        printf("%d\n",b);    }    return 0;}
0 0