iPhone开发【二十二】数据持久化总结之第3篇—归档(NSKeyedArchiver、NSKeyedUnarchiver)

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

转载请注明出处,原文网址:http://blog.youkuaiyun.com/m_changgong/article/details/8284135 作者:张燕广

实现的功能:1)演示使用归档持久化数据。

关键词:数据持久化 归档  NSKeyedArchiver NSKeyedUnarchiver

1、将上一篇iPhone开发【二十一】数据持久化总结之第2篇属性文件(.plist)的工程拷贝一份,名称修改为Persistence-archiver,工程结构如下:


2、添加Person.h类,如下:

Person.h:

#import <Foundation/Foundation.h>

@interface Person : NSObject<NSCoding,NSCopying> 
@property(nonatomic,retain)NSString *name;
@property(nonatomic,retain)NSString *gender;
@property(nonatomic,retain)NSString *age;
@property(nonatomic,retain)NSString *education;
@end
Person.m:

#import "Person.h"
#define kNameKey        @"name"
#define kGenderKey      @"gender"
#define kAgeKey         @"age"
#define kEducationKey   @"education"
@implementation Person
@synthesize name,gender,age,education;

#pragma mark -
#pragma mark NSCoding
-(void)encodeWithCoder:(NSCoder *)aCoder{//编码
    [aCoder encodeObject:name forKey:kNameKey];
    [aCoder encodeObject:gender forKey:kGenderKey];
    [aCoder encodeObject:age forKey:kAgeKey];
    [aCoder encodeObject:education forKey:kEducationKey];
}

-(id)initWithCoder:(NSCoder *)aDecoder{//解码
    if(self == [super init]){
        name = [[aDecoder decodeObjectForKey:kNameKey]retain];
        gender = [[aDecoder decodeObjectForKey:kGenderKey]retain];
        age = [[aDecoder decodeObjectForKey:kAgeKey]retain];
        education = [[aDecoder decodeObjectForKey:kEducationKey]retain];
    }
    return self;
}

#pragma mark -
#pragma mark NSCopying
-(id)copyWithZone:(NSZone *)zone{
    Person *person = [[[self class]allocWithZone:zone]init];
    person.name = [[self.name copyWithZone:zone]autorelease];
    person.gender = [[self.gender copyWithZone:zone]autorelease];
    person.name = [[self.name copyWithZone:zone]autorelease];
    person.name = [[self.name copyWithZone:zone]autorelease];
    return person;
}

@end
3、接下来主要修改ViewController

ViewController.h,主要是修改了宏,如下:

//#define kFileName @"data.plist"
#define kFileName @"archive"
#define kDataKey @"Data"

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
@property(nonatomic,retain)IBOutlet UITextField *name;
@property(nonatomic,retain)IBOutlet UITextField *gender;
@property(nonatomic,retain)IBOutlet UITextField *age;
@property(nonatomic,retain)IBOutlet UITextField *education;

-(NSString *)dataFilePath;
-(void)applicationWillResignActive:(NSNotification *)nofication;

@end
主要修改了ViewController.m,如下:
#import "ViewController.h"
#import "Person.h"

@implementation ViewController
@synthesize name,gender,age,education;

-(NSString *)dataFilePath{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    return [documentsDirectory stringByAppendingPathComponent:kFileName];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
	// Do any additional setup after loading the view, typically from a nib.
    NSString *filePath = [self dataFilePath];
    NSLog(@"filePath=%@",filePath);
    
    if([[NSFileManager defaultManager] fileExistsAtPath:filePath]){
        //属性列表
        /*
        NSArray *array = [[NSArray alloc]initWithContentsOfFile:filePath];
        name.text = [array objectAtIndex:0];
        gender.text = [array objectAtIndex:1];
        age.text = [array objectAtIndex:2];
        education.text = [array objectAtIndex:3];
        
        [array release];*/
        
        NSData *data = [[NSMutableData alloc]initWithContentsOfFile:[self dataFilePath]];
        NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];
        Person *person = [unarchiver decodeObjectForKey:kDataKey];
        [unarchiver finishDecoding];
        
        name.text = person.name;
        gender.text = person.gender;
        age.text = person.age;
        education.text = person.education;
        
        [unarchiver release];
        [data release];
    }
    
    UIApplication *app = [UIApplication sharedApplication];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:app];
    
    [super viewDidLoad];
}

-(void)applicationWillResignActive:(NSNotification *)nofication{
    
    //属性列表
    /*
    NSMutableArray *array = [[NSMutableArray alloc]init];
    [array addObject:name.text];
    [array addObject:gender.text];
    [array addObject:age.text];
    [array addObject:education.text];
    [array writeToFile:[self dataFilePath] atomically:YES];
    [array release];*/
    
    Person *person = [[Person alloc]init];
    person.name = name.text;
    person.gender = gender.text;
    person.age = age.text;
    person.education = education.text;
    
    NSMutableData *data = [[NSMutableData alloc]init];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
    [archiver encodeObject:person forKey:kDataKey];
    [archiver finishEncoding];
    
    [data writeToFile:[self dataFilePath] atomically:YES];
    [person release];
    [archiver release];
    [data release];
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
    self.name = nil;
    self.gender = nil;
    self.age = nil;
    self.education = nil;
}

-(void)dealloc{
    [name release];
    [gender release];
    [age release];
    [education release];
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
	[super viewWillDisappear:animated];
}

- (void)viewDidDisappear:(BOOL)animated
{
	[super viewDidDisappear:animated];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

@end
4、通过iPhone开发【二十】数据持久化总结之第1篇NSUserDefaults 可以知道保存数据archive文件的存储位置是:

 /Users/duobianxing/Library/Application Support/iPhone Simulator/5.0/Applications/F694104D-894D-4230-A01B-C62066B3DEC8/Documents

5、总结:

与属性列表相比,归档可以写入复杂的对象(Person类的实例)。

需要源码的网友请留言哦


iOS数据持久化:使用NSKeyedArchiver进行数据归档 在iOS开发中,NSKeyedArchiver是一种常用的数据归档方式,它可以将自定义的对象和数据结构转换为二进制数据并进行持久化存储。在iOS开发中,NSKeyedArchiver是一种常用的数据归档方式,它可以将自定义的对象和数据结构转换为二进制数据并进行持久化存储。在上面的代码中,我们首先创建了一个Person对象,并使用NSKeyedArchiver将其归档为二进制数据。然后,我们将归档数据写入文件中。在上面的示例中,我们创建了一个名为Person的类,并在该类中定义了name和age两个属性。 阅读详情

相关推荐

保姆级教程:用Python+OpenCV搞定Orbbec Gemini深度与彩色流对齐(附完整代码)

本文提供了一份详细的Orbbec Gemini深度与彩色流对齐教程,涵盖从环境配置到完整代码实现的每一步。通过解析深度流对齐原理,对比不同对齐模式,并提供工业级应用中的问题排查方法,帮助开发者快速掌握Orbbec Gemini相机的使用技巧。文章还包含进阶应用如点云生成与三维重建的实战代码。

weixin_29090917的博客 468

iOS学习 --- iOS12对象序列化(NSKeyedArchiver/NSKeyedUnarchiver)

就是将数据写到一个文件里面去。一般我们的应用的变量常量之类的数据都是在内存里面的,只要APP关闭,这些数据都会丢失。但是把数据存储到文件里面去,就能将数据保存到本地磁盘里面(目前iOS基本就是在沙盒里面操作了),不管是APP关闭还是重启设备,下次启动APP的时候都能够读出来。②、model对象.m类中,要实现+ (BOOL)supportsSecureCoding方法,并返回真。NSKeyedUnarchiver解档。NSKeyedArchiver 归档。

iOS技术分享与学习博客 2192

群晖NAS从入门到精通的所有帖子汇总,只要这一篇就够了

本站陆陆续续的转载、原创帖子也有十几二十篇了,从不同的角度对群晖NAS的各种骚操作都有深入的讲解,虽然很多文章都不是讲的很深入,但是针对小白入门已经是足够了,希望对小白来说是一个入门,群晖NAS的大佬们勿喷,哪里写的不对的,请随时留言西安SEO优化站长一定在第一时间纠正修改。

西安SEO优化网站资源 8万+

用NSKeyedArchiver存储数据(归档)

用NSKeyedArchiver存储数据(归档) 一、NSKeyedArchiver和NSUserDefault的区别 NSUserDefault只能存储基本数据类型,如NSInteger NSString NSArray 但像UIImage就存不进去 将各种类型的对象存储到文件中,而不仅仅是字符串、数组和字典类型,有一种更灵活的方法。就是利用NSKeyedAarchiver类创建带键(ke...

Jian_Ze的博客 887

STC32G电调调试血泪史:从TPH1R403NL MOS管烧毁到PWM信号异常排查全记录

本文详细记录了STC32G无刷电调调试过程中的常见问题与解决方案,包括MOS管烧毁、PWM信号异常等关键故障排查。通过电源系统检测、驱动电路验证及三相平衡调试等实战经验,帮助硬件爱好者快速定位问题,提升电调调试效率。特别针对TPH1R403NL等MOS管的保护措施进行了重点分析。

weixin_33736048的博客 551

【HAL库-STM】智能温控按键小风扇【胎教级教学】

硬件设备:DHT11,0.96寸oled屏,二/三/四线风扇(不挑),面包板 、f10的精英板等等。当人在的风扇面前时可以自行控制风扇,不在面前时又想开风扇就让他温控自行开启,(在这里有一个想法就是加上蓝牙和wifi控制的功能能够远程遥控,这个如果做的再全一点就要自主研发是一个多功能app,这里没有做。针对这个dht11,我一开始是卡在了这个check函数里面,一直是我给完dht11低电平和高电平后,dht11不回复我低电平和高电平,这个不是我的问题,当时代码是没毛病的,这个点一直卡着我。吐血五天实现小成品

weixin_52451652的博客 1738

数据持久化(三)使用NSKeyedArchiver归档

归档是一个数据持久化的过程,该过程用某种格式来保存一个或多个对象,以便以后还原这些对象。 可以使用NSKeyedArchiver类创建带键(keyed)的文件来完成。在带键的文件中,每个归档的对象对应一个键,从文件中加载对象时,就是根据这个键来检索对象。 本文使用NSKeyedArchiver类和NSKeyedUnarchiver类对基本的Foundation对象和自定义的类对象进行归档和恢复。

Jymn_Chen 1万+

error C2039: “int_least8_t”: 不是“`global namespace'”的成员

在向H.265的测试软件HM16.0中配置boost的时候,发现 include &lt;boost/cstdint.hpp&gt;的时候总是会报错:错误 11 error C2039: “int_fast16_t”: 不是“`global namespace'”的成员 D:\Program Files\Caffe\VSContact\boost_1_58_0\boost\cstdint.hpp ...

flyerene的博客 1万+

iPhone开发数据持久化总结之第3篇—归档(NSKeyedArchiver、NSKeyedUnarchiver) .

实现的功能:1)演示使用归档持久化数据。 关键词:数据持久化 归档 NSKeyedArchiver NSKeyedUnarchiver 1、将上一篇iPhone开发数据持久化总结之第2篇属性文件(.plist)的工程拷贝一份,名称修改为Persistence-archiver,工程结构如下: [img] [img]http://dl.iteye.com/upload/attach...

阿弥陀佛 176

在 ABAP CDS View 里把 Conversion Functions 用到极致:FLTP 精度、单位换算、货币换算与小数位处理的工程化实践

数据格式转换在真实项目中比业务逻辑更容易引发问题。ABAP CDS中的转换函数(如FLTP_TO_DEC、UNIT_CONVERSION、CURRENCY_CONVERSION和DECIMAL_SHIFT)可帮助在数据库层统一数据口径,避免应用层重复处理。这些函数支持数值精度治理、单位换算、货币转换和小数位调整,能显著提升报表性能并减少逻辑分散。通过将格式转换前移到数据模型层,可以确保服务层和UI层的数据一致性,同时降低接口传输错误风险。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2349

【读代码】从claude skills到superpowers项目

最近claude skills成了大热门,今天一起看下GitHub 上的开源技能框架,他将“工作流”封装为“技能” (Skills)。本文尝试剖析该项目的技能粒度定义、多技能关联架构、应用逻辑等。与传统的 Function Calling 不同,Superpowers 中的 Skill 定义粒度并非“原子操作”,而是**“认知模式” (Cognitive Mode) 或“工作阶段”**。

kakaZhui的博客 1918

深入理解iPhone数据持久化(手把手教你iphone开发 – 基础篇)

在所有的移动开发平台数据持久化都是很重要的部分:在j2me中是rms或保存在应用程序的目录中,在symbian中可以保存在相应的磁盘目录中和数据库中。symbian中因为权限认证的原因,在3rd上大多数只能访问应用程序的private目录或其它系统共享目录。在iphone中,apple博采众长,提供了多种数据持久化的方法,下面笔者会逐个进行详细的讲解。 iphone提供的数据持久化的方...

146

5分钟快速上手:用AI生成3D虚拟场景的保姆级教程

你是否想过:不用学复杂的3D建模软件,不用懂“多边形”“UV贴图”这些专业术语,也能快速生成一个梦幻的森林、未来感的城市,甚至外太空基地?本文的目的就是教完全没接触过3D技术的新手,用AI工具5分钟生成3D虚拟场景。我们会覆盖主流AI工具的选择、提示词编写技巧、生成后的简单调整,以及常见问题解决。本文会像“游戏任务指南”一样,从“认识工具”→“写提示词”→“生成场景”→“调整优化”逐步讲解,最后还会教你把生成的3D场景用起来!提示词:你给AI的“订单备注”,越详细效果越好。扩散模型。

AI 原生应用开发的博客 1962

【IPHONE开发-OBJECTC入门学习】对象的归档和解归档

main.m #import #import "Person.h" int main(int argc, const char * argv[]) { @autoreleasepool { //-----------第1种归档方式--------- //1.使用NSKeyedArchiver 归档对

Android For Java 933

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

iOS 归档(沙盒缓存数据)

缓存一条数据没啥意义 实际开发中一般都是缓存很多条数据或者是一个Dictionary甚至其他对象 tips:同一对象缓存可以使用同一沙盒路径 不同类型的数据千万别使用同一沙盒路径 不同类型数据如果使用同一路径那么缓存的很可能就是最后归档的数据 我尝试过 切记 1、缓存100条数据 数据内容为Person对象 创建Person类 遵守<NSCoding>协议...

iOS野狼的专栏 466

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

iPhone数据存储及持久化

iPhone数据存储及持久化 在 所有的移动开发平台数据持久化都是很重要的部分:在j2me中是rms或保存在应用程序的目录中,在Symbian中可以保存在相应的磁盘目录中和数据库 中。symbian中因为权限认证的原因,在3rd上大多数只能访问应用程序的private目录或其它系统共享目录。在iPhone中,apple博采 众长,提供了多种数据持久化的方法,下面笔者会逐个进行详细

简简单单,平平淡淡 667

iphone开发中数据持久化之——模型对象归档(二)

在Cocoa世界中,术语“归档”是指另一种形式的序列化,它可以实现对任何对象的序列化。使用对模型对象进行归档的技术可以轻松将复杂的对象写入文件,然后再从中读取它们。只要在类中实现的每个属性都是标量(如int或float)或都是符合NSCoding协议的某个类的实例,就可以对该对象进行归档。由于大多数支持数据存储的Foundation和Cocoa Touch类都符合NSCoding,因此对于大多数类来说,归档相对而言比较容易实现。为了增加灵活性,在使用应用中,NSCoding协议最好与NSCopying协议一

Belial计算机视觉&机器视觉专栏 1356

ios数据持久化-属性列表NSUserDefaults、对象归档NSKeyedArchiver和NSKeyedUnarchive、嵌入式数据库(SQLite3)...

在所有的移动开发平台数据持久化都是很重要的部分:在j2me中是rms或保存在应用程序的目录中,在Symbian中可以保存在相应的磁盘目录中和数据库中。Symbian中因为权限认证的原因,在3rd上大多数只能访问应用程序的private目录或其它系统共享目录。在iPhone中,APPLE博采众长,提供了多种数据持久化的方法,下面笔者会逐个进行详细的讲解。iPhone提供的数据持久化的方法,从数据保存...

weixin_34220623的博客 122

ios iphone 如何序列化存储,保存数据。

主要做一下汇总。 1。首先还是官方文档Archives and Serializations Programming Guide http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Ar

5014

iOS:文件归档和解归档的详解和使用

文件归档和解归档: 用途: 所谓文件归档,就是把需要存储的对象数据存储到沙盒的Documents目录下的文件中,即存储到了磁盘上,实现数据的持久性存储和备份。解归档,就是从磁盘上读取该文件下的数据,用来完成用户的需求。对象归档是将对象归档以文件的形式保存到磁盘中(也称为序列化,持久化),使用的时候读取该文件的保存路径的读取文件的内容(也称为接档,反序列化),(对象归档的文件是保密的,在...

weixin_33729196的博客 112

深入理解iPhone数据持久化

深入理解iPhone数据持久化 在所有的移动开发平台数据持久化都是很重要的部分:在j2me中是rms或保存在应用程序的目录中,在symbian中可以保存在相应的磁盘目录中和数据库中。symbian中因为权限认证的原因,在3rd上大多数只能访问应用程序的private目录或其它系统共享目录。在iphone中,apple博采众长,提供了多种数据持久化的方法,下面笔者会逐个进行详细的讲解。

544

iPhone数据存储之属性和归档Archive

iPhone每个应用都会有三个文件夹分别是documents、tmp、library分别称为存储应用的数据,临时数据,数据库。我们要保存的数据会在documents中。 AD:2014WOT全球软件技术峰会北京站 课程视频发布 iPhone数据存储之属性和归档Archive是本文要介绍的内容,在iPhone中有四种方式可以永久存储数据分别是属性列表、归档、SQL

jinyeweiyang的专栏 418

深入理解iPhone数据持久化(手把手教你iphone开发 - 基础篇)

转自:http://blog.youkuaiyun.com/dongfengsun/article/details/4799249 在所有的移动开发平台数据持久化都是很重要的部分:在j2me中是rms或保存在应用程序的目录中,在symbian中可以保存在相应的磁盘目录中和数据库

geforce 484
上一篇: iPhone开发【二十一】数据持久化总结之第2篇—属性文件(.plist)
下一篇: iPhone开发【二十三】常用IOS开源组件【第1篇】
程序员长弓
博客等级 码龄20年 650粉丝 183原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值