归档和解档:即将数据写入文件和从文件中读取数据。

此处以plist文件为例说明,

一、plist文件使用时的注意事项:

1.plist文件中仅支持写入Array,Dictionary,Boolean,Data,Date,Number,String类型。

2.如果想要将自定义类的对象数据写入plist文件,则需要将对象修改为NSData类型写入。

二、归档步骤:

1.自定义的类必须遵守NSCoding协议,重写其归档和解档的方法。
- (void)encodeWithCoder:(NSCoder *)aCoder;
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder;

2.使用[NSKeyedArchiver archivedDataWithRootObject:p1]方法将p1对象转化为NSData类型。

3.通过NSArray调用arrayWithObjects方法写入plist文件中。

三、解档步骤:

1.从plist文件中读取内容

2.调用 [NSKeyedUnarchiver unarchiveObjectWithData:arr[i]]方法将NSData对象转化为Person对象。

四、plist基本类型的写入:

1.代码如下:

 //注意:此处的路径为应用程序束的路径,即工程在开发人员本地的路径
NSString *filePath = @"/Users/zsx/Documents/zsxzsx/JieDang_GuiDang/JieDang_GuiDang/nameList.plist"; //写入的数据的类型为NSArray,plist根结构类型只包括NSArray和NSDictionary两种。
NSArray *arr = [[NSArray alloc]initWithObjects:@"zhangwuji",@"qiaofeng",@"shipotian",@"moyuan",@"yehua", nil]; BOOL flag = [arr writeToFile:filePath atomically:YES];
if (flag) {
NSLog(@"写入成功..");
}

2.打印结果为:

2017-02-25 15:18:25.917848 JieDang_GuiDang[24127:1160011] 写入成功..

3.plist内容中的数据为:

五、自定义类型数据的写入

1.首先介绍自定义类Person,其.h代码为:

 @interface Person : NSObject<NSCoding>
@property(nonatomic,copy)NSString *name;
@property(nonatomic,assign)NSInteger age;
- (instancetype)initWithName:(NSString *)name withAge:(NSInteger)age;
@end

2.Person.m的代码为:

 @implementation Person

 - (instancetype)initWithName:(NSString *)name withAge:(NSInteger)age {
self = [super init];
if (self) {
_age = age;
_name = name;
}
return self;
} - (NSString *)description
{
return [NSString stringWithFormat:@"name:%@ age:%ld", self.name,self.age];
} #pragma mark- NSCoding
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:self.name forKey:@"name"];//key和value尽量保持一致
[aCoder encodeInteger:self.age forKey:@"age"];
}
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeIntegerForKey:@"age"];
return self;
}
@end

3.自定义对象数据写入:

 void writeToPlist(NSString *filePath){
//1.遵循NSCoding协议,才能进行归档和解档
Person *p1 = [[Person alloc]initWithName:@"zhangwuji" withAge:];
Person *p2 = [[Person alloc]initWithName:@"lilei" withAge:];
Person *p3 = [[Person alloc]initWithName:@"hanmeimei" withAge:]; //2.将对象转化为NSData对象
NSData *data1 = [NSKeyedArchiver archivedDataWithRootObject:p1];
NSData *data2 = [NSKeyedArchiver archivedDataWithRootObject:p2];
NSData *data3 = [NSKeyedArchiver archivedDataWithRootObject:p3]; //3.写入文件
NSArray *arr2 = [NSArray arrayWithObjects:data1,data2,data3, nil];
BOOL flag = [arr2 writeToFile:filePath atomically:YES];
if (flag) {
NSLog(@"自定义对象写入成功...");
}
}

4.自定义对象的读取:

 void readFromPlist(NSString *filePath) {
//1.从plist文件中读取内容
NSArray *arr = [NSArray arrayWithContentsOfFile:filePath]; for (int i = ; i < arr.count; i++) {
//2.将NSData对象转化为Person对象
Person *p = [NSKeyedUnarchiver unarchiveObjectWithData:arr[i]];
NSLog(@"%@",p);
}
}

5.调用:

 int main(int argc, const char * argv[]) {
@autoreleasepool {
//如果想要写入自定义类型对象的数据,则需要将自定义类型的对象转化为Data类型,才允许写入
NSString *fPath = @"/Users/zsx/Documents/zsxzsx/JieDang_GuiDang/JieDang_GuiDang/objectList.plist"; //写入plist文件
writeToPlist(fPath); //从plist文件中读取
readFromPlist(fPath);
}
return ;
}

6.打印结果为:

2017-02-25 15:18:25.918924 JieDang_GuiDang[24127:1160011] 自定义对象写入成功...
2017-02-25 15:18:25.919242 JieDang_GuiDang[24127:1160011] name:zhangwuji age:20
2017-02-25 15:18:25.919302 JieDang_GuiDang[24127:1160011] name:lilei age:18
2017-02-25 15:18:25.919341 JieDang_GuiDang[24127:1160011] name:hanmeimei age:17

7.plist中显示的二进制数据。。

iOS基础知识之归档和解档的更多相关文章

  1. 【IOS学习基础】归档和解档

    一.归档介绍 1.归档是指用某种格式来保存一个或多个对象,以便以后还原这些对象的过程.归档是将数据持久化的一种方式(所谓数据持久化,就是指在IOS开发过程中,将数据保存到本地,能够让程序的运行更加流畅 ...

  2. runtime之归档和解档

    IOS开发之NSCoding协议(使用runtime)近期学习IOS的runtime库,然后看到之前写的NSCoding协议有点复杂,如果属性少还好,如果100多个属性,则会显得麻烦.下面使用常规方式 ...

  3. OC 归档和解档

    #import <Foundation/Foundation.h> #define PATH @"/Users/mac/Desktop/file.txt" int ma ...

  4. 利用Runtime对Ivar实例变量进行共用的归档和解档方式

    一.介绍 在OC中每一个对象持有的变量都是实例变量,实例变量包括成员变量和属性变量,在runtime中用Ivar表示对象的实例变量.其实,runtime源码中可以看到,Ivar也是一个结构体(基本上在 ...

  5. IOS数据存储之归档/解档

    前言: 前天学习了NSUserDefaults,我们知道NSUserDefaults不能保存自定义对象,所以我们今天来认识一下归档(NSKeyedArchiver)和解档(NSKeyedUnarchi ...

  6. iOS - 基础知识总结(OC版) 面试必看 再不看就要用swift了

    OC的理解与特性 OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装.继承.多态.它既具有静态语言的特性(如C++),又有动态语言的效率(动态绑定.动态加载等).总体来讲,OC确实是一门不错 ...

  7. iOS面试必备-iOS基础知识

    近期为准备找工作面试,在网络上搜集了这些题,以备面试之用. 插一条广告:本人求职,2016级应届毕业生,有开发经验.可独立开发,低薪求职.QQ:895193543 1.简述OC中内存管理机制. 答:内 ...

  8. ios基础知识

    1获取系统语言设置 NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults]; NSArray *languages = ...

  9. iOS 基础知识

    1获取系统语言设置 NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults]; NSArray *languages = ...

随机推荐

  1. 局域网内远程连接OPC配置方法详解

    局域网内远程连接OPC配置方法详解 https://wenku.baidu.com/view/20fb8ea6d1d233d4b14e852458fb770bf78a3bcc.html   OPC服务 ...

  2. C# 调用Sql server 执行存储过程总是返回-1

    调用存储过程代码如下: 今天在写存储过程调用时遇到如下问题: int value = cmd.ExecuteNonQuery();//执行总是返回-1:且存储过程在sql 可视化执行窗口可正常执行-- ...

  3. Java第03次实验提纲(面向对象1-基本概念)

    0. 将码云的项目clone到本机 请参考使用Eclipse Egit与码云管理你的代码中的3 从码云将项目clone到你的电脑 之后就可以在Eclipse中提交本地项目新增或修改的文件.如果在Ecl ...

  4. 数据仓库3NF基础理论和实例

    一.引言 最近在梳理大数据模式下的数据仓库数据模型,花了点时间,系统的回顾一下传统数据仓库数据模型设计的理论,作为笔记分享给大家,很多资料来自互联网和读过的数据仓库理论和实践相关的熟悉,无剽窃之心,共 ...

  5. Java工程师高手之路

    JVM方面 JVM内存结构 堆.栈.方法区.直接内存.堆和栈区别 Java内存模型 内存可见性.重排序.顺序一致性.volatile.锁.final 垃圾回收 内存分配策略.垃圾收集器(G1).GC算 ...

  6. Eclipse/MyEclipse向HDFS中如创建文件夹等操作报错permission denied解决办法

    不多说,直接上干货! 问题现象 当执行创建文件的的时候, 即: String Path = "hdfs://host2:9000"; FileSystem fileSystem = ...

  7. 单元素枚举类型singleton模块

    public enum Elvis { INSTANCE; public void leaveTheBuilding() { System.out.println("Whoa baby, I ...

  8. PAT 乙级 1068 万绿丛中一点红(20 分)

    1068 万绿丛中一点红(20 分) 对于计算机而言,颜色不过是像素点对应的一个 24 位的数值.现给定一幅分辨率为 M×N 的画,要求你找出万绿丛中的一点红,即有独一无二颜色的那个像素点,并且该点的 ...

  9. 高精度算r的n次方 问题 H: 乾隆巡江南

    问题 H: 乾隆巡江南 时间限制: 2 Sec  内存限制: 128 MB提交: 13  解决: 3[提交][状态][讨论版] 题目描述 话说乾隆带着他的宰相刘罗锅和你出巡江南,被杭州城府邀请去听戏, ...

  10. MySQL · 引擎特性 · 基于InnoDB的物理复制实现(转载)

    http://mysql.taobao.org/monthly/2016/05/01/ 在开始之前,你需要对InnoDB的事务系统有个基本的认识.如果您不了解,可以参考我之前的几篇关于InnoDB的文 ...