runtime 获取类的属性,方法,成员变量,以及协议 字典转model 总结

runtime 字典解析转实体model,支持基本数据类型属性,支持递归解析 最近自己尝试封装一些iOS开发中常用的库,在所有面向对象语言开发环境中,数据业务处理我们偏向用实体model来编写业务代码。 在iOS客户端mvc架构模式中,网络层返回的json转化为字典后,我们经常会将字典转换成对应的实体model。 iOS中字典和实体model转化是利用runtime,动态遍历Class所有属性Property,构造属性get,setter方法,再利用objc_msgSend 阅读详情

runtime 的使用笔记

1 runtime 获取类的属性,方法,成员变量,以及协议

unsigned int count;
    //获取属性列表
    objc_property_t *propertyList=class_copyPropertyList([model class], &count);
    for (unsigned int i=0; i<count; i++) {
        const char *propertyName=property_getName(propertyList[i]);
        NSLog(@"propertyName----->%@",[NSString stringWithUTF8String:propertyName]);
        NSLog(@"propertyValue----->%@",[model valueForKey:[NSString stringWithUTF8String:propertyName]]);
        NSLog(@"propertyValueClass----->%@",[[model valueForKey:[NSString stringWithUTF8String:propertyName]] class]);
    }
    //获取方法列表
    Method *methodList=class_copyMethodList([model class], &count);
    for (unsigned int i=0; i<count; i++) {
        Method method=(methodList[i]);
        NSLog(@"method----->%@",NSStringFromSelector(method_getName(method)));
    }
    //获取成员变量列表
    Ivar *ivarList=class_copyIvarList([model class], &count);
    for (unsigned int i=0; i<count; i++) {
        Ivar myIvar=ivarList[i];
        const char *ivarName=ivar_getName(myIvar);
        NSLog(@"Ivar----->%@",[NSString stringWithUTF8String:ivarName]);
    }
    
    //获取协议列表
    __unsafe_unretained Protocol **protocolList=class_copyProtocolList([model class], &count);
    for (unsigned int i=0; i<count; i++) {
        Protocol *myProtocal=protocolList[i];
        const char *protocolName=protocol_getName(myProtocal);
        NSLog(@"protocol----->%@",[NSString stringWithUTF8String:protocolName]);
    }


2 runtime 简单字典转model  自定义方法

model.h

@property (nonatomic ,copy)NSString *propertyA;
@property (nonatomic ,copy)NSString *propertyB;
@property (nonatomic ,copy)NSString *propertyC;

+ (instancetype)modelWithDictionary:(NSDictionary *)dictionary;

model.m

+ (instancetype)modelWithDictionary:(NSDictionary *)dictionary{
    return [[self alloc]initWithDictionary:dictionary];
}

- (instancetype)initWithDictionary:(NSDictionary *)dictionary{
    self = [super init];
    if (self) {
        unsigned int count;
        //获取属性列表 遍历并赋值
        objc_property_t *propertyList=class_copyPropertyList([self class], &count);
        for (unsigned int i=0; i<count; i++) {
            const char *propertyName=property_getName(propertyList[i]);
            //属性名
            NSString *propertyNameStr = [NSString stringWithUTF8String:propertyName];
            NSString *propertyValue = [dictionary objectForKey:propertyNameStr];
            if ([WYHTools isBlankString:propertyValue]) {
                propertyValue = @"暂无";
            }
            [self setValue:propertyValue forKey:propertyNameStr];
        }
    }
    return  self;
}



高效开发iOS系列(runtime篇) -- debug模式下使用po命令打印model的属性和值(runtime + debugDescription) 在开发过程中, 往往会有很多的model来装载属性. 而在开发期间经常会进行调试查看model里的属性值是否正确. 那么问题来了, 在`objective-c`里使用`NSLog("%@",model)`这行代码打印出来的却是`model`的地址. 不是我们所想要的结果~! 看图: 阅读详情

相关推荐

手势控制 Python !Leap Motion Python 开发教程 (二)

手势控制 Python !Leap Motion Python 开发教程 (二) 现在进入正题,我来给大家总结一下我在使用 Leap Motion 开发过程中的经验以及学到的东西,其中我会概括以及翻译官方给出的注释,为了让这些注释更加通俗易懂,让大家更好理解。 回顾 在上一篇文章中我们讲了如何配置 Leap Motion 的 Python 2.7 的开发环境,如果您还没有配置好您的开发环境,可以参...

成畅的博客 3193

Protobuf

下载protobuf-net_r668.zip,解压,把Full/unity内的所有文件复制到unity的Plugins目录内 创建协议文件,此处命名为chatapp.proto package ChatApp; message User{ required string name=1; required string chat=2; optional string email=3; } message Chat{ repeated User user=1; } 将p.

凡情的博客 2797

医学影像弹性形变处理

这段代码的主要流程是:读取 DICOM 医学影像,尝试使用 MONAI 进行弹性形变(根据版本适配),如果失败则使用 OpenCV 实现,最后可视化并保存处理结果。这样可以在不同环境下灵活处理医学影像的弹性形变需求。后面会写一篇解释弹性变形方法的短文。

wh_xia_jun的专栏 779

C# DateTime类型 直接使用Proto、Bson 问题

默认这里的时区为UTC、DateTimeOffset 为0,参考下面文档可找到;这就会导致设置的时区信息丢失,如下eg.// json08:00",// proto, 没有带时间戳// bson由于DateTime时C#的内建类型,不能使用 RuntimeTypeModel.Default.Add() 中添加查看源码可知,当;时序列化时会带时区。

qq_36790074的博客 472

第二十六届中国机器人及人工智能大赛CRAIC决赛小型桌面级-立体仓储代码分享

国二奖,精度还有不少问题,没有视觉模块,单线程,比起其他大佬写的确实还有欠缺,继续加油吧。

qq_68232259的博客 691

保姆级教程:用xmir-patcher一键解锁Redmi AX3000路由器的SSH(附视频演示)

本文提供Redmi AX3000路由器SSH解锁的保姆级教程,详细介绍了使用xmir-patcher工具一键解锁SSH的步骤,包括环境搭建、工具获取、图形化操作详解及常见问题排查。解锁后,用户可通过SSH连接实现刷机、插件安装、网络优化等高级功能,提升路由器性能。

weixin_29216049的博客 732

runtime 任意类型 model 数据库方便存储

//这里边直接上代码 之后我在慢慢地讲解 之后我的QQ:378254160 我有DEMO 方便你们的使用联系我备注 runtime+数据库+任意model类型 当然有时候也是有局限的 //DataBasehandle.m #import "DataBasehandle.h" #import <objc/runtime.h> #import <sqlite3.h>...

weixin_34319640的博客 107

思科模拟器Cisco Packet Tracer交换机的管理配置

一、交换机的管理方式:带内管理和带外管理 通过交换机的 Console 端口管理交换机属于带外管理;这种管理方式不占用交换机的网络端口,第一次配置交换机必须利用 Console 端口进行配置。 通过 Telnet、拨号等方式属于带内管理。 二、控制台配置思科交换机 1.新建拓扑图 新建拓扑,选择console线连接交换机和PC,一端接交换机的console口,一端接PC的RS 232 口(...

qq_37992321的博客 2万+

手工使用Protobuf-net工具来序列化对象

如果用C#中Runtime的序列化方式,体积太大,因为序列化了好多类型信息。这个时候用protobuf是最好的选择。在Unity中,可以使用Protobuf-net。 下面是手工写proto的例子: [ProtoContract] public class Student { public Student() { } // 缺省构造函数一定要有,否则不能调用Deserialize

stalendp的专栏 5287

用nTopology五分钟生成三维Voronoi泡沫:节点式建模从原理到实操

多孔结构在增材制造与轻量化设计中应用广泛,其中Voronoi泡沫因其优异的缓冲吸能和比刚度表现备受关注。传统CAD建模需处理复杂布尔运算和网格修复,而隐式建模通过数学场描述几何体,将空间距离与密度分布转化为可视化节点,大幅降低操作门槛。nTopology基于场驱动与参数化逻辑,无需编写命令,即可实时调节胞元尺寸、壁厚及随机种子,快速生成可打印的泡沫实体。这种工作流适用于缓冲垫、医疗植入体、航空支架等场景,也为梯度密度结构与力学仿真验证提供了高效路径。本文围绕三维Voronoi泡沫的生成原理与节点操作流程,详

weixin_26767391的博客 154

【ROS2】Arduino系列之机器人底盘实现

介绍ros中提供的一个已经封装了的模块: ros_arduino_bridge,该模块由下位机驱动和上位机控制两部分组成,通过该模块可以更为快捷、方便的实现自己的机器人平台

guilin 1486

Runtime获取类属性列表和方法列表

Runtime获取类的属性列表和方法列表 Runtime很强大,他使得OC中没有真正意义上的私有属性和私有方法,我们可以利用OC的运行时拿到一个类的任何方法和任何属性,然后动态的去调用方法,objc_megsend(),甚至可以在运行时动态的为一个类去添加属性和方法,此篇博客要学习的是两个知识点:获取对象的所有属性 获取对象的所有方法 为了方便,我们可以在项目中为NSObject添加一个cat

文明的博客 9368

uniapp | 基于高德地图实现位置选择功能(安卓端)

在uni-app项目中实现地图位置选择功能的解决方案。由于uni.chooseLocation功能受限,采用高德地图API自主开发。系统由父组件poiMap.vue(负责展示和跳转)和子组件poiBox.vue(核心地图逻辑)构成,通过父子组件通信传递位置数据。关键技术包括:1)使用AMapLoader动态加载地图SDK;2)集成PositionPicker实现拖拽选点;3)异步加载AMapUI插件;4)通过事件监听获取位置详情(地址/经纬度)。

大胆尝试,小心实践 733

iOS开发之遍历Model类的属性并完善使用Runtime给Model类赋值

在上篇博客《iOS开发之使用Runtime给Model类赋值》中介绍了如何使用运行时在实体类的基类中添加给实体类的属性赋值的方法,这个方法的前提是字典的Key必须和实体类的Property Name相同,然后通过运行时来生成和执行Setter方法给Model类的属性赋值。   通过Runtime来给Model类属性赋值的好处是多多的,它便于代码的后期维护,并且提高了开发效率。当你拿到解析

风的坚持 5111

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

swift之用runtime实现字典转模型

很多时候我们需要把从服务器端请求下来的数据转成model类,今天就介绍一下如何利用runtime实现字典转模型1、首先先建一个model类class Person:NSObject {     var name:String?     var age:NSNumber? } 2、为NSObject创建一个extension,在其中实现字典转模型主要分为一下几步(1)获取所有的属性的名字(2)通过

yan520521的专栏 1554

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

runtime 实现json转model

runtime 字典转模型,主要是利用runtime的class_copyIvarList方法来获取到类中的所有的成员变量,字典转模型的情况有以下几种情况: 1、json对象中包含对象,这种情况下,如果model定义的属性名和json中对象的参数一致,则不需要做多余的处理,否则要对model中定义的属性名进行指定,已和json数据中的参数一致 2、json对象中包含数组,数组里面包含其他对象;...

qq_42839789的博客 991

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

将model转化为字典

将model转化为字典 刚入行时就见过项目里有mode转化为字典的代码,后来用过MJExtension的第三方库,非常好用,其实原理就是利用runtime遍历所有属性值,然后进行转化。但是自己从来没有动手写过~~~今天亲自写一写 1.先用runtime遍历所有属性值代码如下:- (NSDictionary *)dicFromObject:(NSObject *)object { NSMuta

gaoyuqiang30的博客 9463

runtime重写description方法打印model属性和值

runtime重写description方法打印model属性和值 在开发过程中, 往往会有很多的model来装载属性. 而在开发期间经常会进行调试查看model里的属性值是否正确. 那么问题来了, 在objective-c里使用NSLog("%@",model)这行代码打印出来的却是model的地址. 不是我们所想要的结果~! 有没有办法解决...

奔跑在路上 173

iOS 字典转模型Model

基本原理 利用 runtime 原理,获取模型中所有实例变量列表,根据实例变量以此获取模型中成员变量的名称和属性类型,区分Foundation和自定义属性,需要对NSDictionary和NSArray类型做单独处理。 下面代码是一个简单的原理实现Demo,真正的框架中需要考虑很多问题,例如可以设置只有某个数组中的属性名才允许进行字典和模型的转换,将属性名换为其他key...

dfgwang1202的博客 246

iOS JSON字典转模型model

iOS开发中,经常会用到字典转模型,咱们平常常用的是MJExstend框架,该框架功能完善,但是在咱们用的时候基本上只是在数据解析的时候会用到json字典转模型,仅此一个功能,你们庞大的一套框架,是不是有些浪费啦,所以咱们自己写一个小的分类,运用&lt;objc/runtime.h&gt;一点点知识点就可以搞定,下面直接上代码:该分类有三个功能:(1)字典 转 模型;(2)模型 转字符串;(3)模...

芷江的博客 2846

一步步完成的 json或字典 转 model

前言 我们在iOS开发中,一般会使用MVC或者MVVM等模式。当我们从接口中拿到数据时,我们需要把数据转成模型使用。下面我就带大家一起用runtime一步一步的来完成这个转换框架.(比较简单的model不用runtime也可以的) . git地址https://github.com/guochaoshun/RootModel 1、先写一个简单的字典到模型的转换 先来最简单的 , 比如服...

gcs的博客 3593

runtime nscode model转字典 存储model数组

#import //获取对象的所有属性 - (NSArray *)getAllProperties {     u_int count;     objc_property_t *properties  =class_copyPropertyList([selfclass], &count);     NSMutableArray *propert

天王盖地虎 698

运用Runtime将字典转Model

首先说下运用KVC将字典转模型的方式: @implementation Status + (instancetype)statusWithDict:(NSDictionary *)dict { Status *status = [[self alloc] init]; [status setValuesForKeysWithDictionary:dict];

Vito_Jianxue的博客 477

iOS 用runtime封装字典转模型

封装字典转模型: 只需传入model名和json数组,用runtime动态的为每个属性赋值,导入头文件objc/runtime,首先,记录model类中的成员变量数,然后class_copypropertylist整体返回objc_property_t类型的指针数组,里面包含了对应的类的各个属性。其次创建数组来存放对象。接着便利json数组(这里可以进行判断,如果json对象不是字典对象就跳过他...

weixin_33720078的博客 159
上一篇: iOS 学习笔记之懒加载
下一篇: 笔记____关于网络请求中需要传同名参数的问题
Scott_cc
博客等级 码龄11年 7粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值