【OC学习-28】自定义对象的归档和解归档:例子说明以及简单总结

对对象进行归档,和对对象进行拷贝差不多路数,也就是需要协议,之前的时对NSString和NSNumber这些对象为什么没有归档协议?因为它们自带了。

所以如果我们要对自定义的对象(而不是Foundation里默认的对象)进行归档的话就需要引入归档协议<NSCoding>。

举例:声明一个User类,然后创建一个对象user1,把这个user1进行归档,然后把归档后的文件解归档到user2中,看看是否是原先的那些数据。

(1)User.h

#import <Foundation/Foundation.h>
@interface User : NSObject<NSCoding> //对自定义对象的归档和解归档需引入协议,就像要拷贝对象,那么这个类要引入拷贝协议一样
@property(nonatomic,copy) NSString *name;
@property(nonatomic,copy) NSString *email;
@property(nonatomic,copy) NSString *passwd;
@property(nonatomic,assign) int age;
@end

(2)User.m

#import "User.h"

@implementation User
//以下两个函数格式是系统默认,直接点击NSCoding查看并复制过来即可
- (void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeInt:_age forKey:@"age"];
    [aCoder encodeObject:_name forKey:@"name"];
    [aCoder encodeObject:_email forKey:@"email"];
    [aCoder encodeObject:_passwd forKey:@"passwd"];
}
- (id)initWithCoder:(NSCoder *)aDecoder{
    self=[super init];
    if (self!=nil) {
        _age=[aDecoder decodeIntForKey:@"age"];
        self.name=[aDecoder decodeObjectForKey:@"name"];
        self.email=[aDecoder decodeObjectForKey:@"email"];
        self.passwd=[aDecoder decodeObjectForKey:@"passwd"];
    }
    return self;
}
@end

(3)main.m

#import <Foundation/Foundation.h>
#import "User.h"

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        //初始化一个对象病赋值
        User *user1=[[User alloc]init];
        user1.age=20;
        [email protected]"jack";
        [email protected]"[email protected]";
        [email protected]"123456";
        //创建文件路径
        NSString *filePath=[NSHomeDirectory() stringByAppendingPathComponent:@"self.arc"];
        //把这个对象归档
        BOOL success=[NSKeyedArchiver archiveRootObject:user1 toFile:filePath];
        if (success) {
            NSLog(@"success");
        }

        //解归档
        User *user2=[NSKeyedUnarchiver unarchiveObjectWithFile:filePath];//解归档到另一个对象中
        NSLog(@"%d,%@,%@,%@",user2.age,user2.name,user2.email,user2.passwd);//输出,完好
    }
    return 0;
}

归档结果,生成一个文件:

解归档结果:

20,jack,[email protected],123456

结合之前的一篇笔记,总结:

a:归档的时候,就是先有一个对象,然后有一个最终文件路径,然后利用[NSKeyedArchiver archiveRootObject:<#(id)#> toFile:<#(NSString *)#>]把对象归档到这个文件中;

b:解归档就是,这个归档的对象是什么类型的,你就用什么类型的对象去接这个解归档生成的东西,解归档之后就可以正常使用这个对象了;

c:归档其实有两种方式:上面总结是简单地就是直接把对象归档到一个文件里。还有一种复杂的就是上一个笔记用得例子,把数据对象data进行归档>>>用归档函数把数据写入到data中>>>把data写入到最终文件中,解归档的路径是先把文件接成data对象然后调用里面的数据,其实一般data是一个字典格式;

d:根据对象是自带的还是自定义的,归档也有些许区别:自定义对象要实现归档,那么它的类必须引入归档协议<NSCoding>;

e:归档后的数据内容都是加密的。

时间: 2024-10-10 22:19:36

【OC学习-28】自定义对象的归档和解归档:例子说明以及简单总结的相关文章

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

文件归档和解归档: 用途: 所谓文件归档,就是把需要存储的对象数据存储到沙盒的Documents目录下的文件中,即存储到了磁盘上,实现数据的持久性存储和备份.解归档,就是从磁盘上读取该文件下的数据,用来完成用户的需求.对象归档是将对象归档以文件的形式保存到磁盘中(也称为序列化,持久化),使用的时候读取该文件的保存路径的读取文件的内容(也称为接档,反序列化),(对象归档的文件是保密的,在磁盘上无法查看文件中的内容,而属性列表是明文的,可以查看). 区别: 通过文件归档产生的文件是不可见的,如果打开

将通讯录类(姓名、电话),添加归档和解归档方法,即,添加储存信息到磁盘的方法。

/*1.将通讯录类(姓名.电话),添加归档和解归档方法,即,添加储存信息到磁盘的方法.*/ #import <Foundation/Foundation.h>#import "ConTact.h"#define PATH @"/Users/qianfeng/Desktop/hehe/2.plist" int main(int argc, const char * argv[]) {    @autoreleasepool {        ConTact

【OC学习-27】对象的归档以及解归档——标准数据和自定义数据的例子

对象归档?就是把对象的数据保存成文件实现数据的加密(即在文档中不是明文显示)和永久储存. 需要使用时,则从文件中恢复即可. (1)标准的数据 //main.m文件 #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //把一个数组进行归档 //创建一个文件路径 NSString *homePath=NSHomeDirectory(); NSString *f

(转载)OC学习篇之---对象的拷贝

在前一篇文章中我们说到了如何解决对象的循环引用问题,这一篇文章我们就来介绍一下OC中的对象拷贝概念,这个对于面向对象语言中都会有这种的问题,只是不同的语言有不同的解决方式:C++中有拷贝构造函数,Java中需要实现Cloneable接口,在clone方法中进行操作.但是不过OC更偏向于Java这种方式,OC中如果一个对象需要被拷贝,他需要实现协议: <NSCopying>.<NSMutableCopying> 从名字上我们可以看到,一个协议是用于不可变对象的,一个协议适用于可变对象

OC学习6——面相对象的三大特性

我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这也是面向对象的三大特征.OC学习篇之---类的三大特性(封装,继承,多态) 1.封装(Encapsulation)是指将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问(该隐藏的隐藏,该暴露的暴露).封装的主要目的是: 隐藏类的实现细节 让使用者只能通过预先定义好的方法来访问数据,从而可以在该方法中加入控制逻辑,限制对成员变量的不合理访问 可进行数据检查,从而有

JavaScript基础学习之-自定义对象(2)

自定义对象 一.定义类或对象1.工厂方式创建对象car 1 var oCar = new Object; 2 oCar.color = "red"; 3 oCar.doors = 4; 4 oCar.mpg = 23; 5 oCar.showColor = function(){ 6 alert(this.corlor); 7 }; 8 9 创建多个car 10 function createCar(color, doors, mpg) { 11 var tempcar = new O

OC学习篇之---对象的拷贝

在前一篇文章中我们说到了如何解决对象的循环引用问题:http://blog.csdn.net/jiangwei0910410003/article/details/41926369,这一篇文章我们就来介绍一下OC中的对象拷贝概念,这个对于面向对象语言中都会有这种的问题,只是不同的语言有不同的解决方式:C++中有拷贝构造函数,Java中需要实现Cloneable接口,在clone方法中进行操作.但是不过OC更偏向于Java这种方式,OC中如果一个对象需要被拷贝,他需要实现协议: <NSCopyin

Python学习:自定义对象

一:首先看一段小程序 <span style="font-size:18px;">class person: def __init__(self): print "new person" p = person();</span> 可以看出:python中用关键字class自定义对象,后面加一个冒号 然后需要定义类的构造方法__init_,构造方法中需要传入参数self,这个self相当于java中的this,指向对象自己. 然后p = Per

归档和解归档

沙盒 1.定义 沙盒:IOS的沙盒(sandbox)机制:是一种安全体系,IOS应用程序只能对自己创建的应用程序进行读取文件,这个独立 封闭 安全的空间,就是咱们说得沙盒.他里面一般存放着你的程序需要的文件,数据持久化的一些文件(Plist sqlist…)音视频 图片以及其他资源文件 2.每个应用程序只有一个沙盒 沙盒里面有三个文件夹 1)Documents 目录下的内容 会被同步到另一台设备 可以存放媒体资源 文本资源 2)Library 可以把缓存的内容放到Library/Caches 3