反射实现NSCodingProtocol 帮助类

// .h文件#import <Foundation/Foundation.h>
@interface NSCodingProtocolHelper : NSObject
+(void)encodeWithCoder:(NSCoder *)aCoder andObj:(id)obj;
+(id)initWithCoder:(NSCoder *)aDecoder andObj:(id)obj;

@end
// .m文件#import "NSCodingProtocolHelper.h"
#import <objc/runtime.h> //反射需要用到的头文件

@implementation NSCodingProtocolHelper
+(void)encodeWithCoder:(NSCoder *)aCoder andObj:(id)obj
{
    unsigned int outCount;
    objc_property_t *properties = class_copyPropertyList([obj class], &outCount);
    for (int i = 0; i < outCount; i++) {
        objc_property_t *thisProperty = properties + i;
        NSString *propertyName = [NSString stringWithUTF8String:property_getName(*thisProperty)];
        [aCoder encodeObject:[obj valueForKey:propertyName] forKey:propertyName];
    }
}

+(id)initWithCoder:(NSCoder *)aDecoder andObj:(id)obj
{
    unsigned int outCount;
    objc_property_t *properties = class_copyPropertyList([obj class], &outCount);
    for (int i = 0; i < outCount; i++) {
        objc_property_t *thisProperty = properties + i;
        NSString *propertyName = [NSString stringWithUTF8String:property_getName(*thisProperty)];
        [obj setValue:[aDecoder decodeObjectForKey:propertyName] forKey:propertyName];
    }
    return obj;
}
@end

使用方法:

在要实现NSCodingProtocle的类中重写 initWithCoder: 和encodeWithCoder: 方法,

例如:

-(void) encodeWithCoder:(NSCoder *)aCoder
{
    [NSCodingProtocolHelper encodeWithCoder:aCoder andObj:self];

}
-(id)initWithCoder:(NSCoder *)aDecoder
{
    return [NSCodingProtocolHelper initWithCoder:aDecoder andObj:selfl];
}

  

时间: 2024-10-13 22:13:07

反射实现NSCodingProtocol 帮助类的相关文章

C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值

转自goldeneyezhang原文 C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值 C#利用反射,遍历获得一个类的所有属性名,以及该类的实例的所有属性的值总结: 对应某个类的实例化的对象tc, 遍历获取所有属性(子成员)的方法(采用反射): Type t = tc.GetType();//获得该类的Type //再用Type.GetProperties获得PropertyInfo[],然后就可以用foreach 遍历了 foreach (PropertyInfo pi

利用反射机制,获取类的字段、方法、并实现简单调用

这篇文章是为之后要介绍Android的ICO框架做预备的,所以,如果想最近学习Android的ICO框架的同学,可以稍微看一下. 首先,简单介绍一下Java里面的反射. JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 不知道这样的一段解释,你能否看懂.如果更简单的说,反射就是能够根据你给出类名实例化出一个实实在在的对象.所以,对象的实例

Android利用反射机制为实体类属性赋值

在做android项目时,有时会遇到从网络上获取json类型数据,赋值给实体类,实体类属性少可以一个一个的赋值,如果实体类有很多属性,赋值可能就要耗很长的功夫了,幸好Java给我们提供了反射机制.下面是在我在android中如何利用java反射机制给实体类赋值. 在Android中利用反射机制为实体类属性赋值,首先需要导入一下两个包 import java.lang.reflect.Field; import java.lang.reflect.Method; 给实体类赋值首先需要一个实体类,这

java android布局里的控件值 反射绑定给实体类,实体类绑定给控件,表单提交绑定很有用

注意了:根据实际情况,添加实体里字段的类型,控件类型的判断才可使用.这里控件只有TextView EditText 实体类字段只有String int类型,带值的控件添加tag ,值和实体类的字段值一致 package ice.ui.service; import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import jav

反射及数学运算符类

1.API(接上篇): 数学运算符类(random 随机类)产生随机数,前包后不包Math类—基本数学运算方法:(1)abs() 返回绝对值(2)Math.max(a,b) 比较a,b值大小,输出较大的值(3)Math.min(a,b) 比较a,b值大小,输出较小的值(4)round() 四舍五入(5)floor 向下取整(6)ceil() 向上取整(7)random() 返回0到1之间的小数2.反射:(类的加载机制 Classloder)运行时探究和使用编译时未知的类反射就是操作Class类第

透彻分析反射的基础_Class类

一.反射的基石--->Class类 1. Java类用于描述一类事物的特性,该类事物有什么属性,没有什么属性,值域这个属性的值是什么,则是由这个类的实例对象来确定的,不同的实例对象有不同的属性值.Java程序中的各个Java类,他们是否属于同一类事物,是不是可以用一个类来描述这类事物呢?这个类的名字就是Class,要注意与小写class关键字的区别哦.Class类描述了哪些方面的信息呢?类的名字,类的访问属性,类所属的包名,字段名称的列表,方法名称的列表,等等.学习反射,首先就要明白Class这

java反射机制取出model类的所有变量,以及value

原文:java反射机制取出model类的所有变量,以及value 源代码下载地址:http://www.zuidaima.com/share/1550463649270784.htm 工作上遇到个问题,顺便解决了,希望对大家有帮助 package com.zuidaima.util; public static void main(String[] args) throws ClassNotFoundException, IllegalArgumentException, IllegalAcce

利用反射api查找一个类的详细信息

说到这个实例,首先介绍下本人,我是一个php程序员,从事drupal开发2年多,可以说从实习开始就接触这个,至今没有换过,drupal给我的感觉是俩字"强大",今天写一个views的字段,然后需要继承views的views_handler_field类,还要自己实现里面的一些方法,走一些自己的配置设置,查看这个类的时候,发现实在是太多信息了,并且做了好些继承,于是我就想要是能实现一个功能,传入一个类名,然后就能返回类的所有信息(包括,属性,方法,继承,接口,并且这些类所放置的文件位置,

C#用反射实现两个类的对象之间相同属性的值的复制

在进行实体转换操作的时候如果需要在对两个实体之间两个属性字段差不多相同的类要进行一个互相的转换,我们要把a对象的所有字段的值都复制给b对象,我们只能用b.属性=a.属性来写,如果属性字段太多的话,就要写很多行复制语句,麻烦还容易漏掉一些,这个时候可以利用c#的反射来实现复制.我们可以写这样一个利用泛型的映射函数. 1.适用于创建实体的时候从一个实体作为数据源赋值 /// <summary> /// 反射实现两个类的对象之间相同属性的值的复制 /// 适用于初始化新实体 /// </sum