利用运行时给模型赋值

前提是模型属性和key要一致 下面的代码只需要修改这个类方法就可以用了

+(instancetype)userCommentsWithDict:(NSDictionary *)dict{
    id obj = [[self alloc]init];
    NSArray *array =[self loadProperties];
    
    for (NSString *key in array) {
        if (dict[key]) {
            [obj setValue:dict[key] forKey:key];
        }
    }
    return obj;
}
+ (NSArray *)loadProperties {
    unsigned int count = 0;
    
    // 返回值是所有属性的数组
    objc_property_t *properties = class_copyPropertyList([self class], &count);
    
    NSMutableArray *arrayM = [NSMutableArray arrayWithCapacity:count];
    
    for (int i = 0; i < count; ++i) {
        // 1. 从数组中获得属性
        objc_property_t pty = properties[i];
        
        // 2. 拿到属性名称
        const char *cname = property_getName(pty);
        [arrayM addObject:[NSString stringWithUTF8String:cname]];
    }
    
    // 释放属性数组
    free(properties);
    
    return arrayM;
}

时间: 2024-08-04 03:39:39

利用运行时给模型赋值的相关文章

Java 进阶(一) JVM运行时内存模型

1.JVM运行时数据区域的划分 a.程序计数器(Program Counter Register) 一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器.每个线程拥有独立的一个计数器,如果当前执行的是Native方法,则计数器值为空. b.JVM栈(Java Virtual Machine Stack) 描述Java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧(Stacks Frame)用于存储局部变量表,操作数栈,动态链接,方法出口等信息. 每一个方法从调用直至执行完成

运行时内存模型

运行时内存模型运行时中,类型.对象.线程和托管对有相互的关系.CLR的一个windows进程,这个进程中可能存在多个现在.一个线程创建时,会分配1M的栈.这个栈主要用于方法传递实参和方法内部定义的局部变量.如果方法中有涉及到对象,则在堆中创建类型对象和类型实例.类型对象主要由类型对象指针.同步块索引.静态字段.方法列表组成.类型实例主要由类型对象指针.同步块索引.实例字段组成.其中类型实例的类型对象指针指向类型对象的类型对象指针.它们的相互关系如下图所示. 通过这张图,可以清楚了解运行时的内存由

java运行时内存模型

运行时内存分为: 1.方法区 2.堆 3.虚拟机栈 4.本地方法栈 5.程序计数器 方法区.堆是共享的,所有线程都可以读取 虚拟机栈.本地方法栈.程序计数器是线程私有的,每个线程单独一套,它们在线程创建时生成,在线程死亡时销毁 堆分为年轻代,老年代,永久代.分区的目的是为了更快的分配内存和更好的执行垃圾回收.主要作用是存户对象实例,绝大部分实例和数据都存储在堆中,gc就作用于堆 hotspot虚拟机的方法区存储在永久区,方法区的实现jvm规范没有强制规定,hotspot虚拟机这么实现完全是为了懒

关于JAVA中的static方法、并发问题以及JAVA运行时内存模型

一.前言 最近在工作上用到了一个静态方法,跟同事交流的时候,被一个问题给问倒了,只怪基础不扎实... 问题大致是这样的,"在多线程环境下,静态方法中的局部变量会不会被其它线程给污染掉?": 我当时的想法:方法中的局部变量在运行的时候,是存在JAVA栈中的,方法运行结束,局部变量也就都弹光了,理论上单线程的话是不会有问题的,我之所以不知道,是因为不清楚在JAVA内存模型中,一个线程对应一个栈,还是多个线程共享一个栈... 其实如果知道每个线程都有一个自己的JAVA栈的话,问题也就很清楚了

利用运行时遍历一个类中的成员变量。

// 备注:可以在需要的地方调用这段代码. // 但是调用前必须引用 #import <objc/runtime.h> 头文件 - (void)ivarListDemo { unsigned int count; Ivar *ivarArray = class_copyIvarList([UITextField class], &count); for (int i = 0; i < count; i++) { Ivar ivar = ivarArray[i]; NSLog(@&

iOS开发小技巧--利用运行时得到隐藏的成员变量

一.关于运行时,已经从网络上摘抄了一片文章,这里只有项目中自己的简单使用 -- 查找隐藏的成员变量 导入头文件 可以获得隐藏的成员变量,方法,属性等 代码: 打印效果图:

iOS 利用运行时交换系统方法实现禁止同时点击两个按钮触发多个事件

#import "UIViewController+Parents.h" /** 导入头文件 */ #import <objc/runtime.h> @implementation UIViewController (Parents) //load方法会在类第一次加载的时候被调用 //调用的时间比较靠前,适合在这个方法里做方法交换 + (void)load{ //方法交换应该被保证,在程序中只会执行一次 static dispatch_once_t onceToken; d

运行时类型信息RTTI

我们在写C++代码的时候经常碰到使用dynamic_cast进行类型转换的情况,也都知道经过dynamic_cast的转换更加安全,因为dynamic_cast进行了类型检查. 但是可能很多人不知道dynamic_cast是C++ 运行时类型信息(RTTI)机制链条上的一个节点. RTTI提供了两个操作符和一个类: dynamic_cast typeid type_info 整个RTTI, 作为一个整体,暴露给程序员的就是这三个元素.因此我们关注的焦点也就在它们身上了. 什么是RTTI 在C++

Android M 新的运行时权限开发者需要知道的一切

本文来自微凉一季的博客http://jijiaxin89.com/2015/08/30/Android-s-Runtime-Permission/ 更多文章点击跳转微凉一季 tags: 翻译,这是一篇译文. android M 的名字官方刚发布不久,最终正式版即将来临! android在不断发展,最近的更新 M 非常不同,一些主要的变化例如运行时权限将有颠覆性影响.惊讶的是android社区鲜有谈论这事儿,尽管这事很重要或许在不远的将来会引发很严重的问题. 这是今天我写这篇博客的原因.这里有一切