iOS基础知识之归档和解档
归档和解档:即将数据写入文件和从文件中读取数据。
此处以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基础知识之归档和解档的更多相关文章
- 【IOS学习基础】归档和解档
		
一.归档介绍 1.归档是指用某种格式来保存一个或多个对象,以便以后还原这些对象的过程.归档是将数据持久化的一种方式(所谓数据持久化,就是指在IOS开发过程中,将数据保存到本地,能够让程序的运行更加流畅 ...
 - runtime之归档和解档
		
IOS开发之NSCoding协议(使用runtime)近期学习IOS的runtime库,然后看到之前写的NSCoding协议有点复杂,如果属性少还好,如果100多个属性,则会显得麻烦.下面使用常规方式 ...
 - OC 归档和解档
		
#import <Foundation/Foundation.h> #define PATH @"/Users/mac/Desktop/file.txt" int ma ...
 - 利用Runtime对Ivar实例变量进行共用的归档和解档方式
		
一.介绍 在OC中每一个对象持有的变量都是实例变量,实例变量包括成员变量和属性变量,在runtime中用Ivar表示对象的实例变量.其实,runtime源码中可以看到,Ivar也是一个结构体(基本上在 ...
 - IOS数据存储之归档/解档
		
前言: 前天学习了NSUserDefaults,我们知道NSUserDefaults不能保存自定义对象,所以我们今天来认识一下归档(NSKeyedArchiver)和解档(NSKeyedUnarchi ...
 - iOS - 基础知识总结(OC版) 面试必看 再不看就要用swift了
		
OC的理解与特性 OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装.继承.多态.它既具有静态语言的特性(如C++),又有动态语言的效率(动态绑定.动态加载等).总体来讲,OC确实是一门不错 ...
 - iOS面试必备-iOS基础知识
		
近期为准备找工作面试,在网络上搜集了这些题,以备面试之用. 插一条广告:本人求职,2016级应届毕业生,有开发经验.可独立开发,低薪求职.QQ:895193543 1.简述OC中内存管理机制. 答:内 ...
 - ios基础知识
		
1获取系统语言设置 NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults]; NSArray *languages = ...
 - iOS 基础知识
		
1获取系统语言设置 NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults]; NSArray *languages = ...
 
随机推荐
- servet概述
			
1定义 Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层. 使用 Servl ...
 - C# 调用Sql server 执行存储过程总是返回-1
			
调用存储过程代码如下: 今天在写存储过程调用时遇到如下问题: int value = cmd.ExecuteNonQuery();//执行总是返回-1:且存储过程在sql 可视化执行窗口可正常执行-- ...
 - <亲测>window+iis+letsencrypt+ssl 手动续期(通配符域名)
			
之前提到过 window环境下 生成ssl通配符域名证方法为:https://www.cnblogs.com/duanweishi/p/9491209.html 下文为在window环境下手动续 ...
 - DS二叉树--二叉树之数组存储
			
二叉树可以采用数组的方法进行存储,把数组中的数据依次自上而下,自左至右存储到二叉树结点中,一般二叉树与完全二叉树对比,比完全二叉树缺少的结点就在数组中用0来表示.,如下图所示 从上图可以看出,右边的是 ...
 - 检索COML类工厂中 CLSID为 {00024500-0000-0000-C000-000000000046}的组件时失败,原因是出现以下错误: 80070005" 《终结篇》
			
可以看到报出的异常类型为:UnauthorizedAccessException,没有权限访问,表明我们需要配置执行操作账户的COM访问权限. 由于系统是Windows Server 2008 64位 ...
 - LeetCode——15.  3Sum
			
一.题目链接:https://leetcode.com/problems/3sum/ 二.题目大意: 3和问题是一个比较经典的问题,它可以看做是由2和问题(见http://www.cnblogs.co ...
 - Windows下利用TortoiseSVN搭建本地SVN服务器
			
写在前面: 安装TortoiseSVN时,图中这步要选择,才能同时安装后面需要的svnserve.exe 环境说明: Win 7 TortoiseSVN 1.7 搭建步骤: 0. 新建一个目录,做&q ...
 - bzoj4980: 第一题
			
Description 神犇xzyo听说sl很弱,于是出了一题来虐一虐sl.一个长度为2n(可能有前缀0)的非负整数x是good的,当且仅当 存在两个长度为n(可能有前缀0)的非负整数a.b满足a+b ...
 - 在外部怎么调用jquery插件里的function
			
文章来源:百度知道 问:(function($){函数(){xxxx}})(jQuery),我怎么调用这个函数呢? (function($){ function render(jq){ 这里是jque ...
 - HBase - Filter - 过滤器的介绍以及使用
			
1 过滤器HBase 的基本 API,包括增.删.改.查等.增.删都是相对简单的操作,与传统的 RDBMS 相比,这里的查询操作略显苍白,只能根据特性的行键进行查询(Get)或者根据行键的范围来查询( ...