iOS属性反射:说白了,就是将两个对象的所有属性,用动态的方式取出来,并根据属性名,自动绑值。(注意:对象的类,如果是派生类,就得靠其他方式来实现了,因为得到不该基类的属性。)

常用的反射方式,有如下两种:

从一个自定义实体类->自定义实体类

从一个NSDictionary->自定义实体类(此方式最最常用,如网络Json数据会组成NSDictionary。sqlite查询数据,可以用第三方组件组成NSDictionary)

直接上码,(这里码在NSObject类别中)

获取对象所有属性:

- (NSArray*)propertyKeys

{

    unsigned int outCount, i;

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

    NSMutableArray *keys = [[NSMutableArray alloc] initWithCapacity:outCount];

    for (i = ; i < outCount; i++) {

        objc_property_t property = properties[i];

        NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property) encoding:NSUTF8StringEncoding];

        [keys addObject:propertyName];

    }

    free(properties);

    return keys;

}

- (BOOL)reflectDataFromOtherObject:(NSObject*)dataSource

{

    BOOL ret = NO;

    for (NSString *key in [self propertyKeys]) {

        if ([dataSource isKindOfClass:[NSDictionary class]]) {

            ret = ([dataSource valueForKey:key]==nil)?NO:YES;

        }

        else

        {

            ret = [dataSource respondsToSelector:NSSelectorFromString(key)];

        }

        if (ret) {

            id propertyValue = [dataSource valueForKey:key];

            //该值不为NSNULL,并且也不为nil

            if (![propertyValue isKindOfClass:[NSNull class]] && propertyValue!=nil) {

                [self setValue:propertyValue forKey:key];

            }           

        }

    }

    return ret;

}

/////使用方法

NSDictionary *dicJsonData;

EntityObject *objValue;

[objValue reflectDataFromOtherObject:dicJsonData];  //这样就可以完成对象的自动赋值了,

//你还在使用下面的方法吗?

objValue.value = [dicJsonData objectForKey:@"value"];

//out了!

iOS - 反射机制: objc_property_t的使用的更多相关文章

  1. iOS反射机制:objc_property_t的使用

    #import <objc/runtime.h> 需要导入这个头文件. 动态获取一个自定义类对象中的所有属性 - (NSDictionary *)allProperties { NSMut ...

  2. iOS反射机制

    iOS属性反射:说白了,就是将两个对象的所有属性,用动态的方式取出来,并根据属性名,自动绑值.(注意:对象的类,如果是派生类,就得靠其他方式来实现了,因为得到不该基类的属性.) 本人常用的反射方式,有 ...

  3. UNITY3D在IOS开发下的反射机制限制

    IOS上的反射是部分支持,支持使用反射读取源代码,但不支持使用反射动态生成可执行代码,下面是限制反射的命名空间:ProfilerReflection.EmitReflection.Emit.Save ...

  4. 2018年底,IOS面试题的复习之OC的反射机制

    明天要去面试一个公司,今天复习下IOS题目吧 1.说一下OC的反射机制 答:OC的反射机制类似于JAVA的反射机制,这种动态反射机制可以让OC语言更加灵活.这句话是对反射机制的初步认识,具体表现在哪里 ...

  5. iOS 开发--Objective-C 反射机制

    了解反射机制 Objective-C语言中的OC对象,都继承自NSObject类.这个类为我们提供了一些基础的方法和协议,我们可以直接调用从这个类继承过来方法.当然,本篇文章中讲到的反射方法,就在NS ...

  6. iOS 反射 学习 和 运用

    iOS  反射 学习 和 运用 反射:  通过 类名来获得生成的相应的类的实例 的这种机制  叫 反射 常用的反射方式 把 NSDictionary  转成 自定义 model 自定义 model 转 ...

  7. OC学习9——反射机制

    1.OC提供了3种编程方式与运行环境进行交互: 直接通过OC的源代码:这是最常见的方式,开发人员只是编写OC源代码,而运行环境负责在后台工作. 通过NSObject类中定义的方法进行动态编程:因为绝大 ...

  8. Java学习之反射机制及应用场景

    前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...

  9. 第28章 java反射机制

    java反射机制 1.类加载机制 1.1.jvm和类 运行Java程序:java 带有main方法的类名 之后java会启动jvm,并加载字节码(字节码就是一个类在内存空间的状态) 当调用java命令 ...

随机推荐

  1. Leetcode: Longest Common Subsequence

    Given two strings text1 and text2, return the length of their longest common subsequence. A subseque ...

  2. flutter Switch组件 On/off 用于切换一个单一状态

    import 'package:flutter/material.dart'; class SwitchDemo extends StatefulWidget { @override _SwitchD ...

  3. pytorch transforms.Lambda的使用

    当你想要对图像设置transforms策略时,如: from torchvision import transforms as T normalize = T.Normalize([0.485, 0. ...

  4. Oracle的存储过程基本写法

    转: Oracle的存储过程基本写法 目录 1.1,Oracle存储过程简介: 1.2,创建存储过程的语法: 2.0,游标的使用.看到的一段解释很好的概念,如下: 回到顶部 1.1,Oracle存储过 ...

  5. 面向对象(实际就像python跳用自己写的库那样)

    被调用的对象(库) FanFa.java 文件 package com.BM; public class FanFa { #变量值 int r=4 #方法 public static void uui ...

  6. java中如何使用列表数组

    java中如何使用列表数组 觉得有用的话,欢迎一起讨论相互学习~Follow Me 转载链接 https://blog.csdn.net/hgtjcxy/article/details/8183519 ...

  7. 【431】Prim 算法 & Kruskal 算法

    Prim 算法: Minimum Spanning Tree(MST):最小生成树,就是连接所有节点的最小权值 mst集合与rest集合 mst集合中顶点,找到一条最小权值的边 然后把边相关的顶点,选 ...

  8. LeetCode_205. Isomorphic Strings

    205. Isomorphic Strings Easy Given two strings s and t, determine if they are isomorphic. Two string ...

  9. 未找到路径“ ”的控制器或该控制器未实现 IController。

    未找到路径“/Platform/t_spay_sub_mchno/Index”的控制器或该控制器未实现 IController. 从SVN复制了份代码修改,然后找不到控制器和页面.在项目属性-WEB- ...

  10. 【GStreamer开发】GStreamer播放教程06——可视化音频

    目标 GStreamer有一系列把音频转换成视频的element.他们可以用于科学的目的或者增加音乐播放器的趣味性.本教程展示: 如何允许音频的可视化 如何选择可视化element 介绍 在playb ...