浅谈runtim的归档和解档

自定义一个Person类

Person.h里面

#import <Foundation/Foundation.h>

//遵循一个NSCoding协议

@interface Person : NSObject<NSCoding>

//定义三个person类的属性

@property(strong,nonatomic)NSString *name;

@property(assign,nonatomic)int age;

@property(strong,nonatomic)NSString *addr;

@end

Person.m里面

#import "Person.h"

#import <objc/runtime.h>

@implementation Person

//实现编码方法

-(void)encodeWithCoder:(NSCoder *)aCoder

{

unsigned int count;

//获取指向当前类的所有属性的指针

objc_property_t *properties=class_copyPropertyList([self class], &count);

for (int i=0; i<count; i++)

{

//获取指向当前类的一个属性的指针

objc_property_t property=properties[i];

//获取C字符串属性名

const char *name=property_getName(property);

//C字符串转OC字符串

NSString *propertyName=[NSString stringWithUTF8String:name];

//通过关键字取值

NSString *propertyValue=[self valueForKey:propertyName];

//对属性进行编码

[aCoder encodeObject:propertyValue forKey:propertyName];

}

//释放

free(properties);

}

//实现解码方法

-(instancetype)initWithCoder:(NSCoder *)aDecoder

{

unsigned int count;

//获取指向当前类的所有属性的指针

objc_property_t *properties=class_copyPropertyList([self class], &count);

for (int i=0; i<count; i++)

{

//获取指向当前类的一个属性的指针

objc_property_t property=properties[i];

//获取C字符串属性名

const char *name=property_getName(property);

//C字符串转OC字符串

NSString *propertyName=[NSString stringWithUTF8String:name];

//通过关键字取值

NSString *propertyValue=[self valueForKey:propertyName];

//对属性进行解码

[self setValue:propertyValue forKey:propertyName];

}

//释放

free(properties);

return self;

}

//归档和结档

-(void)test

{

Person *person=[[Person alloc] init];

[email protected]"小明";

person.age=11;

[email protected]"贵阳";

NSString *path=[NSString stringWithFormat:@"%@/archive",NSHomeDirectory()];

[NSKeyedArchiver archiveRootObject:person toFile:path];

Person *unarchiverPerson=[NSKeyedUnarchiver unarchiveObjectWithFile:path];

NSLog(@"unarchiverPerson=%@ %@",path,unarchiverPerson);

}

@end

时间: 2024-07-30 22:32:56

浅谈runtim的归档和解档的相关文章

【非凡程序员】 OC第十七节课 文件操作二 (归档和解档)

//-----------------------------归档和解档-----(重点)-------.-----------//        //可变的文件流        NSMutableData *nutabdata=[[NSMutableData alloc]init];        //把用归档格式的数据值给可变的文件流        NSKeyedArchiver *keyde=[[NSKeyedArchiver alloc]initForWritingWithMutable

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

一.归档介绍 1.归档是指用某种格式来保存一个或多个对象,以便以后还原这些对象的过程.归档是将数据持久化的一种方式(所谓数据持久化,就是指在IOS开发过程中,将数据保存到本地,能够让程序的运行更加流畅). 2.想要归档的数据对象,需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和initWithCoder:方法. 3.归档就是将临时数据保存成本地文件. 4.归档的缺点:归档的形式来保存数据,只能一次性归档保存以及一次性解压.所以只能针对小量数据,而且对数据

数据存取,归档和解档,偏好设置

// --- 沙盒路径 // 如何获取沙盒的根目录 NSString* path = NSHomeDirectory(); // 快速查看沙盒目录 // SimPholders2 // 如何获取 doc 路径 NSString* docpath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; // 获取tmp路径 NSString* tmpPath = NSTemporar

归档和解档

归档--encoder    它是将自定义的对象写入磁盘前将对象转成二进制然后存入磁盘. 解档--decoder    它是将磁盘上保存的二进制数据转换成自定义对象. eg: 自定义一个person对象 .h 文件中 @property (nonatomic,copy)NSString *name; @property (nonatomic,assign)int age; .m 文件中 // 归档 - (void)encodeWithCode:(NSCode *)encode { [encode

归档和解档---秀清

// // AccountTool.h // // Created by Joe Zhang on 15/5/23. // Copyright (c) 2015年 张秀清. All rights reserved. // #import <Foundation/Foundation.h> #import "Account.h" @interface AccountTool : NSObject //存储账号 +(void)save:(Account *)account; /

归档和解档配合NSFile存储数据

NSString *Name = @"yc"; //第一个常量NSDocumentDirectory表示正在查找沙盒Document目录的路径(如果参数为NSCachesDirectory则表示沙盒Cache目录), //第二个常量NSUserDomainMask表明我们希望将搜索限制在应用的沙盒内: NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, Y

iOS 文件操作--归档和解档

把自己定义的类所创建的对象直接写入文件的步骤: 自定义类遵循NSCoding协议,实现NSCoding协议中的两个方法: encodeWithCoder:往文件中写入实例变量 initWithCoder:从文件中读取实例变量为当前对象赋值 如果把对象写入文件:调用NSKeyedArchiver中的archiveRootObject:toFile: 如果把对象从文件中读取出来:调用NSKeyedUnarchiver中的unarchiveObjectWithFile:

iOS 浅赋值、深复制、完全复制的知识点梳理验证(附加归档解档)

写于前: 在之前转载的一片文章中,文中对浅复制和深复制进行了详细的解读,同时还提到了深复制(one-level-deep copy).完全复制(true copy)的概念,并指出iOS开发中的深复制是单层深赋值,本文将对这几个概念进行验证梳理. (单层和完全概念区分:例如多层数组只实现一层内容拷贝,其他层为指针拷贝成为单层深复制:若多层内容都实现拷贝称为完全赋值) 程序中用到的几点概念补充 (1) 浅复制(shallow copy):在浅复制操作时,对于被复制对象的每一层都是指针复制. 深复制(

浅谈iOS开发中的对象归档

iOS提供的数据持久化方式有:SQLiteCoreData属性列表.NSUserDefault对象归档. 这里来简单介绍下iOS开发中的对象归档: 对象归档是将对象归档以文件的形式保存到磁盘中(也称为序列化,持久化)使用的时候读取该文件的保存路径读取文件的内容(也称为接档,反序列化) 对象归档的文件是保密的磁盘上无法查看文件中的内容,而属性列表是明文的可以查看) 对象归档有两种方式:1.对foundat中对象进行归档     2.自定义对象归档 1.简单对象归档 使用两个类:NSKeyedA r