iOS--通过runtime完成归档,反归档

通过runtime,不管模型有多少属性,通过几句代码就能完成。

假设person类有N多个属性而是(这里随便写3个)

.h

#import <Foundation/Foundation.h>

@interface Person : NSObject <NSCoding>

@property (nonatomic, assign) int age;

@property (nonatomic, assign) int height;

@property (nonatomic, copy) NSString *name;

@end

.m

#import "Person.h"

#import <objc/runtime.h>

#import <objc/message.h>

@implementation MJPerson

- (void)encodeWithCoder:(NSCoder *)encoder

{

unsigned int count = 0;

Ivar *ivars = class_copyIvarList([Person class], &count);

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

// 取出i位置对应的成员变量

Ivar ivar = ivars[i];

// 查看成员变量

const char *name = ivar_getName(ivar);

// 归档

NSString *key = [NSString stringWithUTF8String:name];

id value = [self valueForKey:key];

[encoder encodeObject:value forKey:key];

}

free(ivars);

}

- (id)initWithCoder:(NSCoder *)decoder

{

if (self = [super init]) {

unsigned int count = 0;

Ivar *ivars = class_copyIvarList([Person class], &count);

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

// 取出i位置对应的成员变量

Ivar ivar = ivars[i];

// 查看成员变量

const char *name = ivar_getName(ivar);

// 归档

NSString *key = [NSString stringWithUTF8String:name];

id value = [decoder decodeObjectForKey:key];

// 设置到成员变量身上

[self setValue:value forKey:key];

}

free(ivars);

}

return self;

}

@end

这样写完后,不管属性的多少,runtime都能够完成模型属性的归档与解档,是不是很方便呢。

当然,还可以把.h和.m里面的代码抽成宏,这样以后想要实现复杂对象的存储只需要写两行代码就能搞定。

时间: 2024-11-05 13:30:33

iOS--通过runtime完成归档,反归档的相关文章

iOS 字符串的UTF8 编码 以及归档反归档

NSString* str = [@"%E4%B8%AD%E5%9B%BD" stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSLog(@"str=%@", str); NSString *str1 = @"中国"; NSString *str2 = [str1 stringByAddingPercentEscapesUsingEncoding:NSUTF8

沙盒机制 归档 反归档

//文件路径 //1.Home主目录:里面有Document, library,tem,和一个应用程序 NSLog(@"%@",NSHomeDirectory()); //2.Document路径 NSString *docuPath=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; NSLog(@"%@",docuPath); //3.Librar

归档反归档 - 本地沙盒存储复杂对象

NSString,NSNumber,NSArray,NSDictionary等简单对象可以方便的存储在本地沙盒文件中,而复杂的对象,诸如属性.方法较多的类对象,就需要使用归档反归档方法(序列化与反序列化),以NSData方式进行存储. 归档反归档,主要的操作顺序是:编码(enCoding) -> 归档(archiver) -> 解码(deCoding) -> 反归档(unarchiver) 1.编码与解码的方法,需要在类的声明文件中接受<NSCoding>协议,在实现文件.m

归档反归档

//归档 反归档(麻烦的方法)    /*    //归档    //创建Person实例对象    Person *person1=[[Person alloc]init];    [email protected]"bbb";    [email protected]"39";        Person *person2=[[Person alloc]init];    [email protected]"aaa";    [email p

Archive(归档/反归档)

1 #import "ViewController.h" 2 #import "Person.h" 3 @interface ViewController () 4 5 @end 6 7 @implementation ViewController 8 9 - (void)viewDidLoad { 10 [super viewDidLoad]; 11 Person *p1 = [Person new]; 12 p1.name = @"Jackie Cha

IOS文件操作和自定义对象的归档(序列化)、反归档(反序列化)

IOS对文件操作包含文件的创建,读写,移动,删除等操作. 1.文件的创建: //设定文本框存储文件的位置 NSString *strFilePath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]; //指定存储文件的文件名 NSString *fileName=[strFilePath stringByAppendingPathComponent:@

UI14-沙盒机制,文件的读写,文件管理器的增删移动复制,归档和反归档。

1.复杂对象的归档反归档.person类的使用acoder,进行编码.使用decoder进行根据标记,解码. 2.再使用多个person类中,需要转化工具和解转化工具,achiver,unchiever,记得结束要finish. 3.文件管理器 对文件和文件夹的增删改移动. 4.读取沙盒的文件,和三个主要路径 5.简单类的读取写入,string,数组,和字典.

归档与反归档

一.归档操作 NSArray *array = @[@"归档",@"反归档",@"开始"]; //1.创建归档对象 NSMutableData *data = [NSMutableData data]; NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]  initForWritingWithMutableData:data]; //2.归档 [archiver encodeObject:pe

【iOS开发-存储】使用NSCoding归档和反归档

iOS开发中要想存储对象可以使用NSCoding,要想存储的对象必须实验NSCoding协议 比如我们要存储一个Student对象,那么Student类必须遵循NSCoding协议,然后实现NSCoding中得两个方法. @interface Student : NSObject <NSCoding> 然后再.m文件中实现encodeWithCoder:(存)和initWithCoder:(读)方法,这样就告诉了程序这个对象应该怎么存,要存那些属性,以及需要怎么读! /** * 将某个对象写入

【学习ios之路:UI系列】iOS沙盒机制,文件读取,归档与反归档

1.IOS中的沙盒机制 IOS中的沙盒机制是一种安全体系,它规定了应用程序只能在为该应用创建的文件夹内读取文件,不可以访问其他地方的内容.所有的非代码文件都保存在这个地方,比如图片.声音.属性列表和文本文件等. 特点: 1.每个应用程序都在自己的沙盒内 2.不能随意跨越自己的沙盒去访问别的应用程序沙盒的内容 3.应用程序向外请求或接收数据都需要经过权限认证 每个沙盒含有3个文件夹:Documents, Library 和 tmp.Library包含Caches.Preferences目录.如下图