利用runtime给model属性赋值
来源:互联网 发布:java stringbuffer() 编辑:程序博客网 时间:2024/03/29 17:32
runtime顾名思义,运行时机制。
oc底层都是C语言实现的,oc编译的时候会把自己的代码搞成C代码,然后运行。
而runtime就是OC和C的桥梁。
其实简单的说,runtime就是一套C语言库~
举个简单的例子:利用runtime给model属性赋值(这部分代码,oc中可以一两句代码实现,这里只是说明runtime的简单应用)。
下面是代码:
创建一个继承自NSObject的类名字叫做SetModel,我从里面声明了一个方法,这个方法要求传入一个模型类,并传入要赋值给模型类的字典。
(这是我们最常见的model赋值模式了)
代码如下:
.h文件内容
#import <Foundation/Foundation.h>@interface SetModel : NSObject//返回赋值后类的实例;传入参数为类名和一个字典//注意:这里的赋值需要类的属性名称和dic中key的名称是一样的,否则赋值会失败+(id)setValueForClass:(Class)cls withDictionary:(NSDictionary *)dic;@end.m文件内容
#import "SetModel.h"#import "objc/runtime.h"#import "objc/message.h"@implementation SetModel//给model属性赋值+(id)setValueForClass:(Class)cls withDictionary:(NSDictionary *)dic{ id model = [[cls alloc] init]; if (model) { unsigned int count = 0;//获取类的属性列表 Ivar *ivars = class_copyIvarList(cls, &count);//给属性赋值 for (int i = 0; i<count; i++) { Ivar ivar = ivars[i]; //获取变量名称 const char *name = ivar_getName(ivar); NSString *key = [NSString stringWithUTF8String:name]; //生成setter方法 NSString *usefullStr = [key substringFromIndex:1]; //跳过下划线 key = usefullStr.capitalizedString; //大写首字母 key = [NSString stringWithFormat:@"set%@:", key]; //拼接set方法字符串 SEL setSel = NSSelectorFromString(key); //调用setter方法 if ([model respondsToSelector:setSel]) { id value = @""; if ([dic objectForKey:usefullStr]!=nil) { value = [dic objectForKey:usefullStr]; } [model performSelectorOnMainThread:setSel withObject:value waitUntilDone:[NSThread isMainThread]]; } } free(ivars); } return model;}@endruntime的用途很多,这是简单的例子。
1 0
- 利用runtime给model属性赋值
- iOS开发之遍历Model类的属性并完善使用Runtime给Model类赋值
- iOS开发之遍历Model类的属性并完善使用Runtime给Model类赋值
- iOS开发之遍历Model类的属性并完善使用Runtime给Model类赋值
- 使用runtime给属性批量初始化赋值
- 利用反射,给model类赋值
- 利用反射快速给Model实体赋值
- 利用反射快速给Model实体赋值
- 利用反射快速给Model实体赋值
- iOS开发之使用Runtime给Model类赋值
- iOS开发之使用Runtime给Model类赋值
- 利用runtime给类别添加属性
- 利用“反射”给类的属性赋值。
- C#利用反射给实体属性赋值
- 利用JavaScript 给元素属性赋值
- 利用反射快速给Model实体赋值(二)
- 利用runtime解析model
- 传个字典给Model,自动给Model中的属性赋值
- LaTeX中的数学公式
- App Store最新审核指南(2015年3月更新版)
- RGB值对照表
- Github之win7桌面应用上传代码 删除项目
- angluar js学习网站
- 利用runtime给model属性赋值
- 用conda安装opencv
- 事务的隔离级别
- 关于zTree树形显示部门及部门里面的成员.
- JSP基础详解
- linux创建新用户后shell无法自动补全命令
- LNMP服务器配置(PHP)
- struts2和spring的两种整合方式
- 2015年年终总结