OC中如果要将自定义类型的对象保存到文件中,必须进行以下三个条件:

想要把存放自定义类型的数组进行 持久化(就是将内存中的临时数据以文件<数据库等>的形式写到磁盘上)必须满足:

1. 自定义对象必须要序列化(将数据有序的存放)

2. 需要使用归档来进行持久化

3. 如果要加载持久化文件需要进行反序列化(就是将有序存放的数据读取并变成自定义对象)

第一要将自定义类型序列化以及第三步并将文件反序列化必须实现OC中的  <NSCoding>协议。

以Student类为例

@interface Student : NSObject<NSCoding>
@property(nonatomic,copy)NSString * name;
@property(nonatomic,copy)NSString * pwd;
@end

进行序列化的方法为

-(void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeObject:self.pwd forKey:@"pwd"];
}

进行反序列化的方法为:

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

需要注意的是,我们在类的声明文件中并不需要声明这两个文件,因为我们只在本类中使用这两个方法,所以我们只需要在实现文件中实现这两个方法就可以了。

值得注意的是归档操作在外面实现这个协议的两个方法时就已经由系统实现,因此我们并不需要实现归档操作。我们需要的仅仅是将文件写入到指定的文件中,以及将该文件读取出来。我们可以理解为,我们在实现读取和写入的方法的过程中,实现了序列化和反序列化操作。进而实现了归档操作。写入文件和读取文件的代码如下:

        [NSKeyedArchiver archiveRootObject:stuArr toFile:@"/Users/Administrator/Desktop/4.plist"];
[NSKeyedUnarchiver unarchiveObjectWithFile:@"/Users/Administrator/Desktop/4.plist"];

遍历该文件所包含的对象即可得到文件中所包含的对象的所有属性

        for(Student * s in stuArr)
{
NSLog(@"%@,%@",s.name,s.pwd);
}

OC中保存自定义类型对象的持久化方法的更多相关文章

  1. GreenDao存储自定义类型对象解决方案(转)

    最近公司项目选用GreenDao作为Android客户端本地数据库的对象关系映射框架.对于GreenDao虽然以往也有简单用过,但这还是笔者第一次在实际业务中使用.碰到了题目所述的两个问题,虽然在Tu ...

  2. 关于void*类型的用法(相当于OC中的id类型)

    关于void*类型的用法(相当于OC中的id类型) 1.C++语言在对于void* 类型的使用很特别,因为void* 可以间接引用任何其他数据类型的指针,比如int*.float*甚至抽象数据类型的指 ...

  3. springmvc中如何自定义类型转换器

    package com.hope.utils;import org.springframework.core.convert.converter.Converter;import org.spring ...

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

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

  5. 2017.9.2Java中的自定义类型的定义及使用&&自定义类的内存图

    今日内容介绍 1.自定义类型的定义及使用 2.自定义类的内存图 3.ArrayList集合的基本功能 4.随机点名器案例及库存案例代码优化 01引用数据类型_类 * A: 数据类型 * a: java ...

  6. 浅析HashSet add() 方法存储自定义类型对象的过程

    一.自定义一个Student类 package date0504; public class Student { private String id; Student(String id){ this ...

  7. OC中结构体作为对象属性

    在OC中结构体有时候也作为对象的属性 类的定义 #import <Foundation/Foundation.h> typedef struct{ int year; int month; ...

  8. OC基础--OC中的类方法和对象方法

    PS:个人感觉跟C#的静态方法和非静态方法有点类似,仅仅是有点类似.明杰老师说过不要总跟之前学过的语言做比较,但是个人觉得,比较一下可以加深印象吧.重点是自己真的能够区分开! 一.OC中的对象方法 1 ...

  9. OC中的枚举类型

    背景 一直对OC中的位移操作枚举不太理解,查找到两篇介绍OC中枚举的文章,觉得很不错. 什么是位移操作枚举呢? typedef NS_OPTIONS(NSUInteger, UIViewAutores ...

随机推荐

  1. PHP文件和目录操作

    目录操作 创建目录:mkdir(目录地址, 权限, 是否递归创建=false); 删除目录:rmdir(目录地址);(仅仅可以删除空目录,不支持递归删除) 移动(改名):rename(旧地址, 新地址 ...

  2. IK词库扩展

    先写个标题,慢慢更新 默认的词库就算最小细粒度分词,很多名词也不会单字分词 比如:阿迪达斯,在IK是一个词,搜索每个字的单字关键词是无结果的,必须搜索阿迪达斯才有结果 所以我们需要扩展词库 IK官方教 ...

  3. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_08 转换流_3_转换流的原理

    FileReader源码的构造方法.底层使用FileInputStram读取 编码不一样占用的字节大小也不一样.GBK一个汉字占用 2个字节. utf-8一个汉字占用三个字节 转换流InputStre ...

  4. 001/Node.js(Mooc)--基础知识

    一.Node.js基础知识 node.js用C++语言编写. 简单的说 Node.js 就是运行在服务端的 JavaScript. Node.js 是一个基于Chrome JavaScript 运行时 ...

  5. 使用MarkDown的编辑器

    今天找到了一个比较全的markdown格式说明http://www.appinn.com/markdown/#precode,特别是代码标注的时候 多行的时候 使用 ... ... .. .. 可以把 ...

  6. vue通信之子父组件通信

    子父组件通信: 创建一个父组件 Home , 创建一个子组件 Head Home 组件: import Head from "./Head.vue" // 引入 Head 组件 c ...

  7. Tesseract5.0训练字库,提高OCR特殊场景识别率(一)

    0.目标 很多特殊场景,原生的字库识别率不高,这时候就需要根据需求自己训练字库生成traineddata文件. 一.前期准备工作 1.安装jdk   用于运行jTessBoxEditor 2.安装jT ...

  8. JavaSE编码试题强化练习7

    1.编写应用程序,创建类的对象,分别设置圆的半径.圆柱体的高,计算并分别显示圆半径.圆面积.圆周长,圆柱体的体积. /** * 圆类 */ public class Circle { /** * 类属 ...

  9. HDFS中NameNode发生故障没有备份从SecondNameNode恢复

    1.Secondary NameNode目录结构 Secondary NameNode用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照. 在/opt/module/hadoop ...

  10. Spark-Core RDD的创建

    一.RDD创建的3种方式: 1.从集合中创建RDD 2.从外部存储创建RDD 3.从其他RDD转换得到新的RDD 二.从集合中创建RDD 1.使用parallelize函数创建 scala> v ...