NSCoding 与归档解档

Objective-C中的时光机器:NSKeyedArchiver与NSKeyedUnarchiver的序列化之旅 本文将详细介绍如何使用这两个类来序列化和反序列化对象,并提供实际的代码示例。进行对象序列化和反序列化的步骤和最佳实践,提供了完整的代码示例,并讨论了在序列化过程中可能遇到的问题和性能优化的考虑。通过本文的指导,你将能够更有效地使用这些工具来保存和恢复你的应用数据。在Objective-C的世界中,对象序列化是一种将对象状态转换为可以存储或传输的形式的技术,而反序列化则是这一过程的逆过程。序列化和反序列化可能是资源密集型的操作,特别是对于大型对象图。在性能敏感的应用中,应谨慎使用,并在适当的时候进行优化。 阅读详情

NSCoding 是一个协议,用于支持对象的序列化和反序列化,也就是“归档”和“解档”操作。归档的过程将对象保存为数据,可以存储到磁盘、数据库或者传输到网络,而解档是将这些数据恢复为原始的对象。

NSCoding 协议

NSCoding 协议有两个主要方法:

  1. encodeWithCoder:: 将对象的状态编码成数据,这个方法在归档过程中被调用。
  2. initWithCoder:: 从数据中解码并还原对象的状态,这个方法在解档时被调用。

为什么使用 NSCoding?

  • 数据持久化:将对象的状态保存到文件中,使得在应用关闭后仍然能恢复这些对象的状态。
  • 数据传输:通过网络发送对象时,可以先将对象归档成二进制格式,再进行传输。
  • 缓存:将对象缓存到磁盘,以便下次使用,避免重复计算或请求。

如何实现 NSCoding?

要让一个类支持归档和解档,必须遵守 NSCoding 协议,具体实现两个方法:encodeWithCoder: 和 initWithCoder:。

示例

假设我们有一个 Person 类,需要将其归档并解档:

1. Person 类实现 NSCoding 协议
#import <Foundation/Foundation.h>

@interface Person : NSObject <NSCoding>

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

- (instancetype)initWithName:(NSString *)name age:(NSInteger)age;

@end

@implementation Person

- (instancetype)initWithName:(NSString *)name age:(NSInteger)age {
    self = [super init];
    if (self) {
        _name = name;
        _age = age;
    }
    return self;
}

#pragma mark - NSCoding

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

// 解档(解码)
- (instancetype)initWithCoder:(NSCoder *)coder {
    self = [super init];
    if (self) {
        _name = [coder decodeObjectForKey:@"name"];
        _age = [coder decodeIntegerForKey:@"age"];
    }
    return self;
}

@end
2. 使用 NSKeyedArchiver 和 NSKeyedUnarchiver 进行归档和解档
// 创建一个 Person 对象
Person *person = [[Person alloc] initWithName:@"Alice" age:30];

// 归档:将 Person 对象转换成 NSData,并保存到文件中
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:person];

// 保存到文件
NSString *filePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"person.archive"];
[data writeToFile:filePath atomically:YES];

// 解档:从文件中读取数据并恢复成 Person 对象
NSData *savedData = [NSData dataWithContentsOfFile:filePath];
Person *decodedPerson = [NSKeyedUnarchiver unarchiveObjectWithData:savedData];

// 输出解档后的对象信息
NSLog(@"Name: %@, Age: %ld", decodedPerson.name, (long)decodedPerson.age);
3. 解释代码
  • 归档:
    • 使用 NSKeyedArchiver 将 Person 对象转化为 NSData。其中,encodeWithCoder: 方法会被自动调用,将对象的属性保存到数据中。
    • 归档后的数据可以保存到文件、数据库或发送到网络。
  • 解档:
    • 使用 NSKeyedUnarchiver 将 NSData 解析为 Person 对象。此时,initWithCoder: 方法被调用,解码过程会根据保存时的 key 恢复对象的状态。

实际应用场景

  1. 用户数据持久化:
    • 当用户退出应用时,保存用户信息(如用户名、头像、登录状态等)到本地,当再次启动应用时,恢复这些信息。
  2. 缓存数据:
    • 将网络请求得到的结果(如图片、文章内容等)进行归档,缓存到本地,下次启动应用时直接读取缓存,减少网络请求。
  3. 对象序列化与反序列化:
    • 在 iOS 应用中,常常需要将对象数据存储到 UserDefaults 或数据库中,使用归档可以非常方便地将对象数据存储和恢复。

注意事项

  • 归档对象需要遵守 NSCoding 协议:只有实现了 encodeWithCoder: 和 initWithCoder: 的类才支持归档。

  • 对象中引用的其他对象也需要遵守 NSCoding 协议:如果一个对象的属性是另一个对象(比如 Person 中的 address 是一个 Address 对象),那么 Address 类也需要实现 NSCoding,否则在归档和解档时会出错。

  • 避免归档非必要属性:对于不需要归档的属性(比如临时计算值、私有变量等),可以在归档过程中忽略。可以通过 @property 和 @dynamic 来排除一些字段的归档。

  • iOS 10 之后,归档和解档的 API 被弃用:

    • iOS 10 后,NSKeyedArchiver 和 NSKeyedUnarchiver 被一些新的方法所替代(如 NSKeyedArchiver.archivedData(withRootObject:)),为了避免未来的兼容性问题,建议使用新的归档 API。
iOS数据持久化:使用NSKeyedArchiver进行数据归档 在iOS开发中,NSKeyedArchiver是一种常用的数据归档方式,它可以将自定义的对象和数据结构转换为二进制数据并进行持久化存储。在iOS开发中,NSKeyedArchiver是一种常用的数据归档方式,它可以将自定义的对象和数据结构转换为二进制数据并进行持久化存储。在上面的代码中,我们首先创建了一个Person对象,并使用NSKeyedArchiver将其归档为二进制数据。然后,我们将归档数据写入文件中。在上面的示例中,我们创建了一个名为Person的类,并在该类中定义了name和age两个属性。 阅读详情

相关推荐

UE5游戏逆向实战:用FModel提取.pak文件中的3D模型(附Dumper-7避坑指南)

本文详细介绍了在UE5游戏逆向工程中使用FModel提取.pak文件中3D模型的实战技巧,包括Dumper-7工具的深度配置与避坑指南。针对UE5特有的unversioned属性系统,提供了从源码编译到智能注入的全链路解决方案,帮助开发者高效获取游戏资产并优化处理流程。

weixin_30374009的博客 496

IOS开发之NSCoding协议(使用runtime)

近期学习IOS的runtime库,然后看到之前写的NSCoding协议有点复杂,如果属性少还好,如果100多个属性,则会显得麻烦。下面使用常规方式和使用Runtime两种方式进行比较,然后总结一下中间遇到的坑。 1.常规方法做归档与解档 //自定义Person类继承自NSObject .h文件 @interface Person : NSObject<NSCoding> @property(nonatomic,strong) NSString * name;//名字 @propert

u013712343的博客 768

SAP ATP检查全解析:从配置到BAPI_RESERVATION_CREATE1应用实例

本文全面解析SAP ATP检查功能,从基础配置到BAPI_RESERVATION_CREATE1高级应用,涵盖物料可用性检查、动态规则设置及性能优化策略。通过实战案例演示如何利用BAPI_MATERIAL_AVAILABILITY实现精准库存承诺,提升供应链效率,特别适合SAP顾问和库存管理人员参考。

dropout6artist的博客 679

iOS Codable 和 NSCoding协议,以及归档,JSON编码

iOS Codable 和 NSCoding协议,以及归档,JSON编码

Lee优快云77的博客 1352

LK32T102 单片机 操作GPIO实现流水灯(1)

前言: LK32T10232(32位)单片机是一款专为电机控制器和数字电源开发的高性能 MCU。采Cortex-M0 内核,最高工作频率可达 72Mhz,ADC 采样速率 达 1Msps。同时具备协处理器单元可满足各种乘法、除法、移位以及各种 复杂函数运算。 LK32T102(32位)支持单电源供电,且内嵌高精度高速及低速振荡器,以及具备 多种低功耗工作模式。同时,集成了多路增强型 PWM,多通道模拟比较 器和高速运算放大器,可满足多种电机及功率控制应用,并简化系统成本。...

qq_58676187的博客 3189

5-->详解《switch 数据接收驱动框架、mtk7621集成交换芯片mt7530》之一

SWITCH 交换芯片驱动配置: 一、 配置 MDIO 总线 二、配置 MAC 接口 三、基于 MAC 的 DMA 配置 四、设备驱动结构体 五、数据收发包

weixin_38387929的博客 1万+

iOS-NSCoder 和 NSCoding

1、为了,iOS提供基本的文件API、Property List序列化、SQLite、CoreData以及NSCoding。对于轻量级的数据要求,NSCoding因其简单而成为一种比较合适的方式。NSCoding是一个你需要在数据类上要实现的协议以支持数据类和数据流间的编码和解码。数据流可以持久化到硬盘。 2、是类对象本身数据的写入到本地文件。 我们需要实现两个方法: encodeWithCoder和initWithEncoder。encodeWithCoder就是编码,initWithCoder就是.

MinggeQingchun的博客 1054

从零开始之stm32之CAN通信

CAN通信极简教程(小白友好版),从小白的视角了解并实现简单的STM32F103的CAN通信,直接上手。

qq_30993593的博客 1307

Object - C运行时应用(三)——实现NSCoding的自动归档和自动解档

当我们需要将一个对象进行归档时,都要让该对象的类遵守NSCoding协议,再实现归档和接档方法。例如有一个Person类,该类有两个成员变量 @property (nonatomic,copy) NSString *name; @property (nonatomic,assign) int age; 两个协议的实现方法如下 /** * 将对象写入某个文件时需要调用,在该方法中说明哪

爱家人,爱老婆,爱生活,爱coding,爱运动的有爱青年 1267

【系统架构设计师-2025上半年真题】综合知识-参考答案及详解(75题完全回忆版)

【系统架构设计师-2025上半年真题】案例分析-参考答案及部分详解

数据知道的博客 1万+

一、C++反作弊对抗实战 (基础篇 —— 2.注册表注入DLL)

在Windows NT/XP操作系统中,当需要加载user32.dll的程序启动时,user32.dll会加载注册表键HLM\Software\Microsoft\WindowsNT\CurrentVersion\Windows\AppInit_dlls下面列出的所有模块。

Koma的主页 1098

Objective-C 类的归档与解档:NSCoding 协议实现对象持久化存储

协议,开发者可以高效实现自定义对象的持久化存储,是 Objective-C 生态中数据本地化的基础解决方案。协议,可将对象转换为二进制数据(归档),或从二进制数据重建对象(解档)。是实现对象持久化存储的核心机制。在 Objective-C 中,

2501_93877399的博客 285

国家基本比例尺分幅土地利用现状图制作

本次主要解决的问题是如何构建脚本快速生成所涉及区域标准国家基本比例尺分幅,然后制作土地利用现状图模板,套用模板生成标准分幅土地利用现状图。

xyt1172228177的博客 2458

iOS swift-归档与解档

1.被归档的对象所在类必须遵守协议 NSCoding 2.被归档的对象所在类必须两个函数来规定如何归档和解档 // MARK:- 归档&解档 /// 解档的函数 init?(coder aDecoder: NSCoder) { } /// 归档的函数 func encodeWithCoder(aCoder: NSCoder) { } 举例: 被归档的对象所在类中(遵守协议 N

LinXunFeng的博客 1067

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

iOS nscoding 实现归档解档

IOS的开发中,小数据量的持久化都用NSUserDefaults来实现,但是NSUserDefaults只能保存NSString, NSNumber, NSDate, NSArray, NSDictionary这些数据类型,但大多时候,我们会将一个对象实体做持久化的保存,由于不是大批量的数据,不会用到sqlite,那么这个时候NSUserDefaults会是很好的选择,其实对象类型可以通过NSCo

qq_31058295的博客 351

第四章 Runtime应用:实现NSCoding的自动归档和自动解档

用runtime提供的函数遍历Model自身所有属性,并对属性进行encode和decode操作。 通常系统自带的数据类型,如:字典NSDictionary,数组NSArray,字符串NSString,布尔数据BOOL,数字对象NSNumber,NSData,NSDate等可以直接进行存储操作;但是自定义的数据类型,如果直接进行存储操作时,则会抛出异常,这时候就需要进行归档、解档处理。 示例代...

番薯大佬的专栏 999

Runtime应用(三)实现NSCoding的自动归档和自动解档

当我们需要将一个对象进行归档时,都要让该对象的类遵守NSCoding协议,再实现归档和接档方法。例如有一个Person类,该类有两个成员变量 @property (nonatomic,copy) NSString *name; @property (nonatomic,assign) int age; 两个协议的实现方法如下 /** * 将对象写入某个文件时需要调用,...

weixin_33859665的博客 149

runtime自动归档/解档

原文出自:标哥的技术博客 前言善用runtime,可以解决自动归档解档。想想以前归档是手动写的,确实太麻烦了。现在有了runtime,我们可以做到自动化了。本篇文章旨在学习如何通过runtime实现自动归档和解档,因此不会对所有类型适用,而是对我们指定的几种类型适用。定义模型我们这里只是写一个例子,用于学习如何用runtime实现自动归档以及解档,因此,我们需要定义一个模型类,然后在里面实现自动归档

标哥 1717

Swift5 归档解档,本地数据持久化存储之UserDefaults

NSUserDefaults支持的数据格式有:NSNumber(Integer、Float、Double),NSString,NSDate,NSArray,NSDictionary,BOOL类型。归档时不一定要直接归档到文件,还可以先将他们归档成NSData,然后将NSData进行存储,用的时候就用这个NSData解档。2.归档的对象包括这个对象中的属性,它们所属类的都必须要遵守NSCoding协议才能归档和解档。如果自定义的类对象要进行归档那么这个对象的属性所属的类也必须要遵守归档协议NSCoding。

huayiyu的博客 1632

iOS 自定义的对象类型的解档和归档

自定义的对象的解档和归档 如果想对自己自定义的类进行解档和归档的话 必须遵循一个协议:NSCoding Student.h 文件 #import <Foundation/Foundation.h> @interface Student : NSObject<NSCoding> @property(nonatomic,strong)NSS...

diaozhuizhi0405的博客 193

Object-C 归档、解档

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 归档(NSKeyedArchiver)/解档(NSKeyedUnarchiver) 归档--》 NSArray *arr = [NSArray arrayWithObjects:@"one",@"two",@"three",nil]; NSMutableData * data = [NS

ifengkeyi的博客 335

(四十一)数据持久化的NSCoding实现 -实现普通对象的存取

NSCoding可以用与存取一般的类对象,需要类成为NSCoding的代理,并且实现编码和解码方法。 假设类Person有name和age两个属性,应该这样设置类: .h文件: #import @interface Person : NSObject // 注意要成为代理 @property (nonatomic, copy) NSString *name; @property (n

最美的时光 770

swift 本地归档、解档储存

1.对用户的模型数据(自定义类:HCUserModel)进行归档和解档 1.1 需要遵循NSCoding协议 1.2 需要实现func encode(with aCoder: NSCoder){}归档方法 1.3需要实现 required init(coder aDecoder: NSCoder){}解档方法 1.4 重写init方法 2.HCUserModel的数据

眼泪笑了 4113

iOS - iOS 12 之后的归档(NSKeyedArchiver)、解档(NSKeyedUnarchiver)用法

一、iOS 12之后旧的归档解档方法废弃了,更改为: 归档: + (nullable NSData *)archivedDataWithRootObject:(id)object requiringSecureCoding:(BOOL)requiresSecureCoding error:(NSError **)error 解档: + (nullable id)unarchivedObjectOfClasses:(NSSet<Class> *)classes fromData:(N.

Q_Q33757152的博客 3098

归档解档(编码解码)

1.理解 a.  如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,可以直接用NSKeyedArchiver进行归档和恢复; b. 不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSCoding协议的对象才可以; 2. NSCoding协议的2个方法: uencodeWit

HenryZhang的博客 1163

使用runtime完成解档归档

简单的创建一个Person对象,并声明几个属性 @interface Person : NSObject<NSCoding> // 归档问题 必须遵守该协议 /** */ @property(copy,nonatomic)NSString * name; /** */ @property(assign,nonatomic)int age; @propert...

193
上一篇: 关于DispatchTime和DispatchWallTime
下一篇: autorelease pool
gp103
博客等级 码龄11年 158粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值