NSCoding可以用与存取一般的类对象,需要类成为NSCoding的代理,并且实现编码和解码方法。

假设类Person有name和age两个属性,应该这样设置类:

.h文件:

#import <Foundation/Foundation.h>

@interface Person : NSObject <NSCoding> // 注意要成为代理

@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age; @end

.m文件

#import "Person.h"

@implementation Person

/**
* 将对象归档的时候调用
*
* @param aCoder 编码对象
*/ -(void)encodeWithCoder:(NSCoder *)aCoder{ //编码成员变量并存入相应的key
[aCoder encodeObject:_name forKey:@"name"];
[aCoder encodeInt:_age forKey:@"age"]; } /**
* 将对象从文件中读取的时候调用
*
* @param aDecoder 解码对象
*
* @return 读取到的对象
*/
- (id)initWithCoder:(NSCoder *)aDecoder{ if (self = [super init]) { self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeIntForKey:@"age"]; } return self; } @end

存储Person的方法:

    Person *p = [[Person alloc] init];
p.name = @"jack";
p.age = 15; NSString *homePath = NSHomeDirectory();
NSString *docPath = [homePath stringByAppendingPathComponent:@"Documents"];
NSString *filePath = [docPath stringByAppendingPathComponent:@"test.data"];
//归档
[NSKeyedArchiver archiveRootObject:p toFile:filePath];

读取Person的方法:

    NSString *homePath = NSHomeDirectory();
NSString *docPath = [homePath stringByAppendingPathComponent:@"Documents"];
NSString *filePath = [docPath stringByAppendingPathComponent:@"test.data"]; //读档(反归档)
Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];

一个细节:

假如有一个Student类继承子Person要存储,如果直接存储,只能调用父类的编码方法,因此子类的特有数据不能保存,应该再重新实现归档函数,但是直接调用父类的归档函数即可初始化原来的数据,再初始化自己的即可。

Tip:通过super调用父类方法可以省去原来属性的初始化。

假设Student多一个学号属性no:

@interface Student : Person

@property (nonatomic, assign) int no;

@end
#import "Student.h"

@implementation Student

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

    [super encodeWithCoder:aCoder];

    [aCoder encodeInt:self.no forKey:@"no"];

}

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

    if (self = [super initWithCoder:aDecoder]) {
_no = [aDecoder decodeIntForKey:@"no"];
} return self; } @end

(四十一)数据持久化的NSCoding实现 -实现普通对象的存取的更多相关文章

  1. iOS中常用的四种数据持久化方法简介

    iOS中常用的四种数据持久化方法简介 iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data 1.属性列表涉及到的主要类:NSUserDefaults,一般 ...

  2. iOS中常用的四种数据持久化技术

    iOS中的数据持久化方式,基本上有以下四种:属性列表 对象归档 SQLite3和Core Data 1.属性列表涉及到的主要类:NSUserDefaults,一般 [NSUserDefaults st ...

  3. 四种数据持久化方式(下) :SQLite3 和 Core Data

    在上文,我们介绍了iOS开发中的其中2种数据持久化方式:属性列表.归档解档. 本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运用: 在本节,将通过对4个文 ...

  4. UI学习笔记---第十四天数据持久化

    一.沙盒机制 每个应用程序位于文件系统的严格限制部分 每个应用程序只能在为该程序创建的文件系统中读取文件 每个应用程序在iOS系统内斗放在了统一的文件夹目录下 沙盘路径的位置 1. 通过Finder查 ...

  5. (四)数据持久化(基于YesSql)

    ORM框架(持久化流程) session是事务 (transaction) 的工厂,处理session后,所有更改将自动刷新到数据库中.或者,如果要处理何时将更改刷新到数据库,即transaction ...

  6. iPhone开发 数据持久化总结(终结篇)—5种数据持久化方法对比

    iPhone开发 数据持久化总结(终结篇)—5种数据持久化方法对比   iphoneiPhoneIPhoneIPHONEIphone数据持久化 对比总结 本篇对IOS中常用的5种数据持久化方法进行简单 ...

  7. iOS学习之数据持久化详解

    前言 持久存储是一种非易失性存储,在重启设备时也不会丢失数据.Cocoa框架提供了几种数据持久化机制: 1)属性列表: 2)对象归档: 3)iOS的嵌入式关系数据库SQLite3: 4)Core Da ...

  8. iOS数据持久化

    在iOS中,实现数据持久化一般分为4大种: 1.属性列表 2.对象归档 3.SQLite 4.Core Data 一.属性列表 NSUserDefaults类的使用和NSKeyedArchiver有很 ...

  9. Redis 小白指南(四)- 数据的持久化保存(草稿)

    Redis 小白指南(四)- 数据的持久化保存 简介 因为 redis 将数据保存在内存中,很容易诱发的一个问题就是,程序崩溃或服务器重启等情况如何保证数据的正常存储. 当我们以 redis 作为主数 ...

随机推荐

  1. 小程序上拉下拉共存时不可使用scroll-view的解决方法

    使用 bindscrolltolower ,必须搭配使用的 scroll-view 会导致小程序 "enablePullDownRefresh": true 下拉不能使用. 解决方 ...

  2. UI相关

    前端 UI 框架 https://github.com/twbs/bootstrap https://github.com/google/material-design-lite https://gi ...

  3. COS对象存储服务的使用

    ---------------------------------------------------------------------------------------------[版权申明:本 ...

  4. 安卓高级9 shareSDK 第三方登陆和分享Mob

    ShareSDK推荐此官网地址 官网注册和申请key流程 注册 略 进入后台创建应用得到可以 下载SDK 解压下载的压缩包 第三方平台申请key 如果你想申请QQ登陆或者分享需要去腾讯开发者申请,申请 ...

  5. Bootstrap3 栅格系统-Less mixin 和变量

    除了用于快速布局的预定义栅格类,Bootstrap 还包含了一组 Less 变量和 mixin 用于帮你生成简单.语义化的布局. 变量 通过变量来定义列数.槽(gutter)宽.媒体查询阈值(用于确定 ...

  6. Android二维码扫描、生成

    Android二维码扫描.生成 现在使用二维码作为信息的载体已经越来越普及,那么二维码的生成以及扫描是如何实现的呢 google为我们提供了zxing开源库供我们使用 zxing GitHub源码地址 ...

  7. Cassandra User 问题汇总(1)------------repair

    Cassandra Repair 问题 问1: 文档建议每周或者每月跑一次full repair.那么如果我是使用partition rangerepair,是否还有必要在cluster的每个节点上定 ...

  8. cassandra 常见问题

    摘要 本文主要介绍在部署cassandra集群以及使用cassandra过程中遇到的一些问题. 文章只发布在CSDN 和个人站点 更多nosql文章可以访问stone fang 个人主页 正文 Q1: ...

  9. 剑指Offer——企业级项目中分层的含义与依据及多态的优势

    剑指Offer--企业级项目中分层的含义与依据及多态的优势   关于以上两点,由于项目经验较少,自己不是很明白,特整理如下. 常见分层架构模式 三层架构 3-tier architecture   微 ...

  10. Linux 高性能服务器编程——Linux网络编程基础API

    问题聚焦:     这节介绍的不仅是网络编程的几个API     更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系.     这节主要介绍三个方面的内容:套接字(so ...