oc 学习(归档)

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

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

使用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.archive

bplist00Ô^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]];
}

@end
int 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]];
}

@end
int 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值