ios runtime部分事例方法说明
一.场景--动态改变变量
unsigned int count = ;
Ivar *ivar = class_copyIvarList([self.person class], &count);
for (int i = ; i<count; i++) {
Ivar var = ivar[i];
const char *varName = ivar_getName(var);
NSString *proname = [NSString stringWithUTF8String:varName]; if ([proname isEqualToString:@"_name"]) { //这里别忘了给属性加下划线
object_setIvar(self.person, var, @"daming");
break;
}
}
NSLog(@"XiaoMing change name is %@",self.person.name);
self.textfield.text = self.self.person.name;
方法说明:
1.Ivar *class_copyIvarList(Class cls, unsigned int *outCount)
用法:返回类的所有属性和变量
参数:class 类型
outCount 类型的数目
返回:Ivar 指针 当做组来用
拓展:class_copyPropertyList 返回对象类的属性(@property申明的属性)
2.const char *ivar_getName(Ivar v)
用法: 返回实例变量的名称。
拓展:ivar_getOffset: 返回实例变量的偏移量。
ivar_getTypeEncoding:返回实例变量的类型字符串。
3. void object_setIvar(id obj, Ivar ivar, id value)
用法:修改类型的变量
参数:obj 所选类
ivar 实例变量
value 更改变量
拓展:id object_getIvar(id obj, Ivar ivar) 获取类实例的变量
二、场景--添加方法
class_addMethod([self.person class], @selector(guess), (IMP)guessAnswer, "v@:");
if ([self.person respondsToSelector:@selector(guess)]) {
//Method method = class_getInstanceMethod([self.xiaoMing class], @selector(guess));
[self.person performSelector:@selector(guess)]; } else{
NSLog(@"Sorry,I don't know");
}
self.textview.text = @"beijing";
1.BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types) //Adds a new method to a class with a given name and implementation.
用法:为类添加一个方法
参数:class 类
SEL 方法选择器 相当于名字
IMP 方法指针
types 描述方法参数类型的字符数组
说明:sel与方法指针名字可以不同 一个是名字 一个是指针地址
三、场景--动态方法交换
self.person = [Person new];
NSLog(@"%@",_person.sayName);
NSLog(@"%@",_person.saySex);
Method m1 = class_getInstanceMethod([self.person class], @selector(sayName));
Method m2 = class_getInstanceMethod([self.person class], @selector(saySex));
method_exchangeImplementations(m1, m2);
1.Method class_getInstanceMethod(Class cls, SEL name)
用法:获取某类的方法(Method类)
参数:class 类
SEL 方法选择器
2.void method_exchangeImplementations(Method m1, Method m2)
用法:交换方法
参数:Method 方法
四、场景--替换方法
//这里也可以使用 [self.person class],不过要先初始化
Method m1 = class_getInstanceMethod([Person class], @selector(sayName));
Method m2 = class_getInstanceMethod([Tool class], @selector(changeMethod)); method_exchangeImplementations(m1, m2);
用法说过了,嗯!
五:场景--方法上增加额外功能
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Class selfClass = [self class];
SEL oriSEL = @selector(sendAction:to:forEvent:);
Method oriMethod = class_getInstanceMethod(selfClass, oriSEL);
SEL cusSEL = @selector(mySendAction:to:forEvent:);
Method cusMethod = class_getInstanceMethod(selfClass, cusSEL);
BOOL addSucc = class_addMethod(selfClass, oriSEL, method_getImplementation(cusMethod), method_getTypeEncoding(cusMethod));
if (addSucc) {
class_replaceMethod(selfClass, cusSEL, method_getImplementation(oriMethod), method_getTypeEncoding(oriMethod));
}else {
method_exchangeImplementations(oriMethod, cusMethod);
}
});
}
- (void)mySendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event {
[[Tool sharedManager] addCount];
[self mySendAction:action to:target forEvent:event];
}
说明:在程序运行时,Runtime会将所有的Class和Category加载到内存中,这时,会调用类的load方法,通知我们Class或Category已经被加载到内存中。
代码逻辑:交换了方法 ,执行逻辑就改变了 :mySendAction触发->再次调用转到原有sendAction方法
1. IMP method_getImplementation(Method m)
用法:获取IMP
拓展:const char *method_getTypeEncoding(Method m) 获取说明
SEL method_getName(Method m) 获取name(SEL)
2.IMP class_replaceMethod(Class cls, SEL name, IMP imp, const char *types)
用法:Replaces the implementation of a method for a given class.
注意:注销 free(ivars);
参考资料来源:https://github.com/Tuccuay/RuntimeSummary
ios runtime部分事例方法说明的更多相关文章
- iOS项目之交换方法(runtime)
在项目中,经常会遇到系统自带的方法满足不了自己的需求,往往我们解决这种情况的时候,都是在分类中添加一个方法.然而很多时候,项目已经开发很长时间了,如果一个一个的去替换系统的方法,太浪费宝贵的时间,所以 ...
- ios runtime的相关知识
一.iOS runtime原理 对于runtime机制,在网上找到的资料大概就是怎么去用这些东西,以及查看runtime.h头文件中的实现,当然这确实是一种很好的学习方法,但是,其实我们还是不会知道r ...
- iOS Runtime的消息转发机制
前面我们已经讲解Runtime的基本概念和基本使用,如果大家对Runtime机制不是很了解,可以先看一下以前的博客,会对理解这篇博客有所帮助!!! Runtime基本概念:https://www.cn ...
- iOS Runtime 实操练习
iOS Runtime 知识详解: http://yulingtianxia.com/blog/2014/11/05/objective-c-runtime/ 一般可以运行Runtime进行以下操作 ...
- iOS runtime探究(二): 从runtime開始深入理解OC消息转发机制
你要知道的runtime都在这里 转载请注明出处 http://blog.csdn.net/u014205968/article/details/67639289 本文主要解说runtime相关知识, ...
- IOS runtime动态运行时二
在C#.Java中有编译时多态和运行时多态,在OC中,只有运行时的多态,这与它的运行机制有关.OC中,方法的调用是通过消息的传递来进行的.在IOS runtime动态运行时一http://www.cn ...
- iOS --runtime理解
iOS~runtime理解 Runtime是想要做好iOS开发,或者说是真正的深刻的掌握OC这门语言所必需理解的东西.最近在学习Runtime,有自己的一些心得,整理如下,一为 查阅方便二为 或许能给 ...
- iOS-提高iOS开发效率的方法和工具
提高iOS开发效率的方法和工具 介绍 这篇文章主要是介绍一下我在iOS开发中使用到的一些可以提升开发效率的方法和工具. IDE 首先要说的肯定是IDE了,说到IDE,Xcode不能跑,当然你也可能同时 ...
- iOS runtime的理解和应用
项目中经常会有一些的功能模块用到runtime,最近也在学习它.对于要不要阅读runtime的源码,我觉得仅仅是处理正常的开发,那真的没有必要,只要把常用的一些函数看下和原理理解下就可以了. 但是如果 ...
随机推荐
- Oracle主键异常处理
Hibernate: insert into test1.WarnWeather (WAREA, wdate, WDAYS, WINFO, WTYPE, WNO) values (?, ?, ?, ? ...
- ERP实施顾问工作中应努力做到哪些?
1.树立并分享信誉 准确的为自己定位,并积极树立自己的信誉.从这样两个角度去考虑问题,一是从高层管理者的角度去思考行业竞争和公司运作的问题,一是从专业.细致的角度去考虑单据.报表.界面等数据处理的问题 ...
- Java代码审查工具findbugs的使用总结
findbugs简介 Findbugs是一个Java代码静态分析工具,可以用它来检查源代码中可能出现的问题,以期尽可能在项目的初始阶段将代码问题解决. FindBugs检查的是类或者JAR文件即字节代 ...
- Jenkins+Git 持续集成
持续集成是必要的! 希望达到的效果是:开发同事签入代码后,对应的站点可以自动实现更新.目前还只在在内部服务器上实现开发环境中的站点更新,不涉及到线上的发布. 目前使用Jenkins实现这样的持续集成. ...
- VS2010在网络共享目录使用IntelliSense、ipch、sdf和SQL Compact Server相关问题
Microsoft SQL Compact Server 是专用于 Visual Studio 的单机SQL 数据库.数据库文件名的后缀为SDF. 而VS2010 拒绝在网络共享目录中建立和打开SDF ...
- commonJS的核心思想
服务器端的 Node.js 遵循 CommonJS规范,该规范的核心思想是允许模块通过 require 方法来同步加载所要依赖的其他模块,然后通过 exports 或 module.exports 来 ...
- gzip 与 gunzip 语法与示例
gzip 与 gunzip 语法与示例 语法: gunzip -c 被压缩的文件 > 已解压的文件示例: 将 catalina.out.gz 文件解压到 catalina.out 文件中: gu ...
- Python 使用心得之--变量命名
目前开发命名规范基本都遵循驼峰命名法,如:userName.我也不将这个规范的特性了,大家都明白.接下来进入正题,如何在python中取一个好名字,让你能更好的见名知意呢? 1.元组(Tuple)类型 ...
- 功能总结之MongDB初探
题外话 工作3年,了解的技术颇多,但都是一知半解,了解不是很透澈.用过的技术,就像猴子搬过的包谷,搬一个丢一个.几年风雨,真有点一缕清风过,片叶不沾身的味道. 为强化知识点,提升文档及学习能力,我把以 ...
- fastlane安装流程和fastlane match同步证书和PP文件方法
分步指南 安装fastlane: ① Make sure you have the latest version of the Xcode command line tools installed: ...