iOS 复杂对象持久化  归档和反归档的过程

本文介绍如何在iOS开发中实现复杂对象的持久化,包括归档和反归档的过程,以及如何通过遵守NSCoding协议来实现复杂对象的序列化。

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

复杂对象持久化就是将复杂对象写入文件.

复杂对象就是Foundation 内不存在的数据类 ,他们是无法直接通过writeToFile:方法写入文件的, 只能通过将复杂对象转换为NSData,然后再写入文件,而这里将复杂对象转换成NSData类型的过程就是归档.

同样我们从文件中读取复杂对象是需要先读取NSData类型数据, 再将其转化为复杂对象,这个过程就是反归档

具体的过程如下代码

****************************************************************************************
创建一个复杂对象Person类
① 遵循协议 
//
//  Person.h
//  归档和反归档
//
//  Created by lanou3g on 16/2/24.
//  Copyright © 2016 GlongF. All rights reserved.
//

#import
<Foundation/Foundation.h>

// 复杂对象想使用归档的前提是遵守 NSCoding协议

@interface Person : NSObject<NSCoding>

@property(nonatomic,strong) NSString *name;
@property(nonatomic,assign) NSInteger age;

@end

**********************************************************************
② 实现协议中两个的方法
//
//  Person.m
//  归档和反归档
//
//  Created by lanou3g on 16/2/24.
//  Copyright © 2016 GlongF. All rights reserved.
//

#import
"Person.h"

@implementation Person

// 实现协议中的方法

// 编码
- (
void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder
encodeObject:self.name forKey:@"name"];
    [aCoder
encodeInteger:self.age forKey:@"age"];
}


// 反编码

- (
instancetype)initWithCoder:(NSCoder *)aDecoder{
   
self = [super init];
   
if (self) {
       
self.name = [aDecoder decodeObjectForKey:@"name"];
       
self.age = [aDecoder decodeIntegerForKey:@"age"];
        }
   
return self;
}


**********************************************************************
③ 持久化过程
//
//  ViewController.m
//  归档和反归档
//
//  Created by lanou3g on 16/2/24.
//  Copyright © 2016 GlongF. All rights reserved.
//

#import
"ViewController.h"
#import
"Person.h"

@interface ViewController ()

@end

@implementation ViewController

- (
void)viewDidLoad {
    [super viewDidLoad];
   // 获取document路径
    NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
   
NSLog(@"doc = %@",documentPath);
   
#pragma mark ------------------------
复杂对象持久化 -----------------
   
// 过程:复杂对象 -> 归档 -> NSData -> 写入文件
   
Person *person = [[Person alloc] init];
    person.
age = 22;
    person.
name = @"张三";
   
NSMutableData *data = [NSMutableData data];
   
   
// 创建归档器
   
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
   
   
// 归档
    [archiver  encodeObject:person forKey:@"person"];

    // 结束归档
    [archiver finishEncoding];
   
   
// 将归档结束的data写入文件
   
NSString *filePath = [documentPath stringByAppendingPathComponent:@"personFile.txt"];
   
    [data
writeToFile:filePath atomically:YES];
   
NSLog(@"filePath = %@",filePath);
   
NSLog(@"data = %@",data);
   
#pragma mark --
从文件中读取复杂对象
   
//过程 (读取文件 -> NSData -> 反归档 -> 复杂对象)
   
// 读取数据
   
NSData *dataRead = [NSData dataWithContentsOfFile:filePath];
   
// 创建反归档工具
   
   
NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:dataRead];
   
   
Person *person1 = [unArchiver decodeObjectForKey:@"person1"];
    [unArchiver
finishDecoding];
   
NSLog(@"person name = %@",person1.name);
   
}

- (
void)didReceiveMemoryWarning {
    [
super didReceiveMemoryWarning];
   
// Dispose of any resources that can be recreated.
}

@end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值