IPhone之模型对象归档

本文介绍了归档和序列化的概念及其在Objective-C中的实现方式。通过实例演示了如何使用NSCoding协议完成对象的归档及从归档文件中读取数据的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

归档指的是另一种型式的序列化,但它是任保对象都可以实现的更常规的类型。

 

  其作用为:进行数据的持久化保存。

 

  对象必须实现NSCodeing协议和NSCopying协议。

 

@interface FourLines : NSObject <NSCoding, NSCopying> {

    NSString *field1;

    NSString *field2;

    NSString *field3;

    NSString *field4;   

}

@property (nonatomic, retain) NSString *field1;

@property (nonatomic, retain) NSString *field2;

@property (nonatomic, retain) NSString *field3;

@property (nonatomic, retain) NSString *field4;

@end
#pragma mark NSCoding

- (void)encodeWithCoder:(NSCoder *)encoder {

    [encoder encodeObject:field1 forKey:kField1Key];

    [encoder encodeObject:field2 forKey:kField2Key];

    [encoder encodeObject:field3 forKey:kField3Key];

    [encoder encodeObject:field4 forKey:kField4Key];

}

- (id)initWithCoder:(NSCoder *)decoder {

    if (self = [super init]) {

        self.field1 = [decoder decodeObjectForKey:kField1Key];

        self.field2 = [decoder decodeObjectForKey:kField2Key];

        self.field3 = [decoder decodeObjectForKey:kField3Key];

        self.field4 = [decoder decodeObjectForKey:kField4Key];

    }

    return self;

}
#pragma mark NSCopying

- (id)copyWithZone:(NSZone *)zone {

    FourLines *copy = [[[self class] allocWithZone: zone] init];

    copy.field1 = [[self.field1 copyWithZone:zone] autorelease];

    copy.field2 = [[self.field2 copyWithZone:zone] autorelease];

    copy.field3 = [[self.field3 copyWithZone:zone] autorelease];

    copy.field4 = [[self.field4 copyWithZone:zone] autorelease];

   

    return copy;

}

 

 

 

 

获取归档文件

 

- (NSString *)dataFilePath {

    NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *documentsDirectory = [paths objectAtIndex:0];

    return [documentsDirectory stringByAppendingPathComponent:@"archive"];

}

 

 

 

对数据进行归档

 

FourLines *fourLines = [[FourLines alloc] init];

    fourLines.field1 = field1.text;

    fourLines.field2 = field2.text;

    fourLines.field3 = field3.text;

    fourLines.field4 = field4.text;

   

//对数据进行归档

    NSMutableData *data = [[NSMutableData alloc] init];

    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];

    [archiver encodeObject:fourLines forKey:@"Data"];

    [archiver finishEncoding];

    [data writeToFile:[self dataFilePath] atomically:YES];

    [fourLines release];

    [archiver release];

    [data release];   

 

 

 

 

获取归档数据

 

    NSString *filePath = [self dataFilePath];

    if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {

        NSData *data = [[NSMutableData alloc]

                        initWithContentsOfFile:[self dataFilePath]];

        NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]

                                         initForReadingWithData:data];

        FourLines *fourLines = [unarchiver decodeObjectForKey:@"Data"];

        [unarchiver finishDecoding];

       

        field1.text = fourLines.field1;

        field2.text = fourLines.field2;

        field3.text = fourLines.field3;

        field4.text = fourLines.field4;

       

        [unarchiver release];

        [data release];       

    }

转载于:https://www.cnblogs.com/AbelChen1991/p/3730808.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值