runtime的黑魔法
要说明runtime,首先要明白objc这门语言,是基于C的封装.真是因为runtime,objc才有了面对对象的特性.
也就说,所有objc的语言,在运行时都会转换成C.
也是基于这样的特性,runtime可以做很多不可思议的事情.比如动态添加成员变量,函数等等.
User *usr = [[User alloc] init];
NSLog(@"%@",usr.description);
unsigned int count = ;
Ivar *members = class_copyIvarList([User class] , &count);
for (int i = ; i<count ; i++) {
Ivar var = members[i];
const char *memName = ivar_getName(var);
const char *memType = ivar_getTypeEncoding(var);
NSLog(@"%s type:%s", memName, memType);
}
//值修改
Ivar name = members[];
object_setIvar(usr, name, @"王三蛋");
NSLog(@"object_setIvar修改成员变量Name后的值:%@",usr.description);
class_addMethod([User class], @selector(method:), (IMP)addingFunc, "i@:i@"); //通过class_addMethod 动态添加函数
unsigned int FuncCount = ;
Method *membersFuncs = class_copyMethodList([User class], &FuncCount);
//遍历已有函数名
for (int i = ; i< FuncCount; i++) {
SEL Met = method_getName(membersFuncs[i]);
NSString *MetName = [NSString stringWithCString:sel_getName(Met) encoding:NSUTF8StringEncoding];
NSLog(@"User的函数:%@",MetName);
}
objc_msgSend(usr,@selector(method:),@"动态添加的函数");
int addingFunc(id self,SEL _cmd,NSString *str)
{
NSLog(@"Added Func,%@",str); return ;
}
给出一个model转换的
//
// NSObject+ModelHandle.h
// MVVM
//
// Created by M on 16/3/3.
// Copyright © 2016年 Meng. All rights reserved.
// #import <Foundation/Foundation.h> @interface NSObject (ModelHandle) +(instancetype)ModelWithDict:(NSDictionary*)dict; @end
//
// NSObject+ModelHandle.m
// MVVM
//
// Created by M on 16/3/3.
// Copyright © 2016年 Meng. All rights reserved.
// #import "NSObject+ModelHandle.h"
#import <objc/runtime.h> @implementation NSObject (ModelHandle) +(instancetype)ModelWithDict:(NSDictionary*)dict
{
id obj = [self new]; for (NSString *propertyName in [self GetProperList]) { if (dict[propertyName]) { [obj setValue:dict[propertyName] forKey:propertyName]; } } return obj;
} +(NSArray*)GetProperList
{
unsigned int count = ; objc_property_t *propertyList = class_copyPropertyList([self class], &count);//获取class里的属性. NSMutableArray *arr = [NSMutableArray array]; for (int i = ; i<count; i++) { objc_property_t property = propertyList[i]; const char *CharName = property_getName(property); NSString *StrName = [[NSString alloc] initWithUTF8String:CharName]; [arr addObject:StrName]; } free(propertyList);//释放 return arr.copy;
} @end
直接在相应的model的头文件里引入 #import "NSObject+ModelHandle.h"
Model *m = [Model ModelWithDict:Dict[@"result"]];
相比 setValuesForKeysWithDictionary, 此函数对数据的检查不是那么严格.
runtime的黑魔法的更多相关文章
- runtime 第四部分method swizzling
接上一篇 http://www.cnblogs.com/ddavidXu/p/5924597.html 转载来源http://www.jianshu.com/p/6b905584f536 http:/ ...
- runtime之消息转发
前言 在上一篇文章中我们初尝了runtime的黑魔法,可以在程序编译阶段就获取到成员变量的名字,特性以及动态的给对象增加属性等等,在接下来中我们进一步了解OC的消息发送机制.如果之前没接触过runti ...
- iOS书写高质量代码之耦合的处理
原创 2016-12-26 MrPeak MrPeak杂货铺 耦合是每个程序员都必须面对的话题,也是容易被忽视的存在,怎么处理耦合关系到我们最后的代码质量.今天Peak君和大家聊聊耦合这个基本功话题, ...
- iOS如何限制使用SDK的版本? 解决iOS项目的版本兼容问题
更新 2015-11-16 感谢微博好友@zyyy_000的评论,补充了为什么要在+ (void)load方法里面做Method Swizzling. 前言 最近,在做项目时,因为某种原因,突然要 ...
- [转]runtime 消息机制
原文地址:http://www.jianshu.com/p/f6300eb3ec3d 一.关于runtime 之前在项目中有遇到过用runtime解决改变全局字体的问题,所以再一次感受到了runtim ...
- iOS开发——高级特性&Runtime运行时特性详解
Runtime运行时特性详解 本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的动态特性,使这门古老的语言焕发生机.主要内容如下: 引言 ...
- Objective-C Runtime 运行时之四:Method Swizzling
理解Method Swizzling是学习runtime机制的一个很好的机会.在此不多做整理,仅翻译由Mattt Thompson发表于nshipster的Method Swizzling一文. Me ...
- iOS开发笔记之Runtime实用总结
前言 runtime的资料网上有很多了,部分有些晦涩难懂,我通过自己的学习方法总结一遍,主要讲一些常用的方法功能,以实用为主,我觉得用到印象才是最深刻的.另外runtime的知识还有很多,想要了解更多 ...
- runtime之玩转成员变量
前言: 不铺垫那么多,单刀直入吧:runtime是一个C和汇编写的动态库,就像是一个小小的系统,将OC和C紧密关联在一次,这个系统主要做两件事情. 1,封装C语言的结构体和函数,让开发者在运行时创建, ...
随机推荐
- 激活windows7 企业版小记
问题:状态不可用 1)控制面板->管理工具->服务,启动SPP Notification Service和Software Protection两项服务后 重启计算机,仍然提示状态不可用. ...
- 通过bitmap对100w数字进行排序去重
首先生成100w随机数,控制最大数 <?php $i = 0; do{ $i++; $num = rand(0, 999999); echo $num."\n"; }whil ...
- Android开发自学笔记(Android Studio)—4.3ImageView及其子类
一.引言 ImageView继承自View组件,主要功能用来显示图片,实际上他能显示的不仅是图片,Drawable对象都可以用ImageView来显示. ImageView派生了ImageButton ...
- 建模算法(七)——排队论模型
(一)基本概念 一.排队过程的一般表示 凡是要求服务的对象称为顾客,凡是为顾客服务的称为服务员 二.排队系统的组成和特征 主要由输入过程.排队规则.服务过程三部分组成 三.排队模型的符号表示 1.X: ...
- CCF 201604-4 游戏
/* 广度优先搜索 左右两个方向 node{x,y,step} 到了就返回step,不到就检查左右两边符合条件就入队. 用一个结构体保存 危险时间 time[i][j]{beg,time} beg=e ...
- 【BZOJ-1419】Red is good 概率期望DP
1419: Red is good Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 660 Solved: 257[Submit][Status][Di ...
- Codeforces Round #342 (Div. 2) A. Guest From the Past(贪心)
传送门 Description Kolya Gerasimov loves kefir very much. He lives in year 1984 and knows all the detai ...
- 优化php代码 - 字符串echo输出 逗号也可作php连接符
2016年12月12日10:00:16 ====================== 网页访问速度的提升,是可以通过代码的优化来实现的.代码的优化,并不是说代码越少越好,而是主要看代码的运行能力和执行 ...
- android md5加密与rsa加解密实现代码
import java.io.UnsupportedEncodingException;import java.security.MessageDigest;import java.security. ...
- 成为java高手的条件
世界上并没有成为高手的捷径,但一些基本原则是可以遵循的. 1.扎实的基础 数据结构.离散数学.编译原理,这些是所有计算机科学的基础,如果不掌握它们,很难写出高水平的程序.程序人人都会写,但当你发现写到 ...