runtime简单的使用解决实际问题(交换方法)
2019独角兽企业重金招聘Python工程师标准>>>
友盟统计中要求在每个页面的viewWillAppear和viewWillDisappear方法中添加友盟统计的方法:
如果是项目开始,可以考虑建个BaseViewController,或者用Category也能实现。可是如果是项目已经有了一定规模之后,再提出以上需求,就需要用到更深层次的技术(runtime)了。
新建一个viewcontroller的category
具体代码:
#import "UIViewController+UmengAnalysis.h"
#import <objc/message.h>
#import "UMMobClick/MobClick.h"@implementation UIViewController (UmengAnalysis)
+ (void)load {[super load];
// 获取两个方法的IMP(指针)Method orgMethod = class_getInstanceMethod([self class], @selector(viewWillAppear:));Method swizzledMethod = class_getInstanceMethod([self class], @selector(customViewWillAppear:));
//交换指针method_exchangeImplementations(orgMethod, swizzledMethod);Method orgDisMethod = class_getInstanceMethod([self class], @selector(viewWillDisappear:));Method swizzledDisMethod = class_getInstanceMethod([self class], @selector(customViewWillDisAppear:));method_exchangeImplementations(orgDisMethod, swizzledDisMethod);
}- (void)customViewWillAppear:(BOOL)animated {[self customViewWillAppear:animated];[MobClick beginLogPageView:NSStringFromClass([self class])];
}
- (void)customViewWillDisAppear:(BOOL)animated{[self customViewWillDisAppear:animated];[MobClick endLogPageView:NSStringFromClass([self class])];
}
@end
UILabel字体大小的问题,类似的新建一个UILabel的category
#import "UILabel+WFFontLabel.h" #import <objc/runtime.h> @implementation UILabel (WFFontLabel) + (void)load { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ Class class = [self class]; // 获取两个方法的IMP(指针) Method originalMethod2 = class_getInstanceMethod(class, @selector(setFont:)); Method swizzledMethod2 = class_getInstanceMethod(class, @selector(WFSetFont:)); // 交换IMP method_exchangeImplementations(originalMethod2, swizzledMethod2); }); } - (void)WFSetFont:(UIFont *)font { UIFont * newFont = [UIFont systemFontOfSize:font.pointSize+10]; [self WFSetFont:newFont]; } @end
load类方法会在每个页面中被调用,在运行时,viewWillAppear
方法会被statisticsViewWillAppear替换,viewWillDisappear会被statisticsViewWillDisappear替换,且每个页面的viewWillAppear、viewWillDisappear方法仍然有效。
个人感觉这是一个很好地能解决多个页面统计的分类。
转载于:https://my.oschina.net/u/2524932/blog/797964
runtime简单的使用解决实际问题(交换方法)相关推荐
- [Runtime]-交换方法
为什么80%的码农都做不了架构师?>>> 1:比如我们有个需求:让UIImage加载图片的时候,告诉我们是否加载成功了 前言: /** Runtime(交换方法):只要是想修 ...
- iOS项目之交换方法(runtime)
在项目中,经常会遇到系统自带的方法满足不了自己的需求,往往我们解决这种情况的时候,都是在分类中添加一个方法.然而很多时候,项目已经开发很长时间了,如果一个一个的去替换系统的方法,太浪费宝贵的时间,所以 ...
- 用计算机处理信息的例子,用计算机解决生活中实际问题的方法--
适用范围:高二年级下期<算法与程序设计>(选修模块) 课时:1课时 一.教学目标 1.课程标准中的相关内容 课程标准在<算法与程序设计>模块中有如下阐述:"教师应引导 ...
- 用计算机解决生活中实际问题的方法,用计算机解决生活中实际问题的方法--
用计算机解决生活中实际问题的方法-- 适用范围:高二年级下期<算法与程序设计>(选修模块) 课时:1课时 一.教学目标 1.课程标准中的相关内容 课程标准在<算法与程序设计>模 ...
- Linux安装软件时缺少依赖包的简单较完美解决方法!
Linux安装软件时缺少依赖包的简单较完美解决方法! 参考文章: (1)Linux安装软件时缺少依赖包的简单较完美解决方法! (2)https://www.cnblogs.com/xiaommvik/ ...
- PHP:使用Zend对源码加密、Zend Guard安装以及Zend Guard Run-time support missing的解决方法
PHP:使用Zend对源码加密.Zend Guard安装以及Zend Guard Run-time support missing的解决方法 参考文章: (1)PHP:使用Zend对源码加密.Zend ...
- 计算机简单故障时的排除方法,电脑简单故障排除解决办法大全
电脑简单故障排除解决办法大全 一.电脑罢 工了?听报警声就可以处理故障! 在使用电脑的时候,我们会经常遇到开机时电脑黑屏没有反应的情况,普通的电脑用户而对这样的故障实在是无从下手,但是一般电脑会有一个 ...
- html webservice数据交互_一种基于WebService的数据交换方法
一种基于WebService的数据交换方法 [专利摘要]本发明涉及数据交换[技术领域],特别涉及一种基于WebService的数据交换方法.本发明是以Web服务为依托,通过定义参数的方式进行传入内容和 ...
- 运用《深入理解Java虚拟机》书中知识解决实际问题
前言 以前看别人博客说看完<深入理解Java虚拟机>这本书并没有让自己的编程水平提高多少,不过却大大提高了自己的装逼水平.其实,我倒不这么认为,至少在我看完一遍这本书后,有一种醍醐灌顶的感 ...
最新文章
- 一文揭秘领域驱动设计(DDD):领域和子域!
- 用Delphi设计能携带附件的EMail
- 沃流量 android,沃流量管家的身世之谜
- 1003. [ZJOI2006]物流运输【区间DP+最短路】
- 【干货】mysql建表语句注释
- [css] 说说你对相对定位、绝对定位、固定定位的理解
- J03-Java IO流总结三 《 FileInputStream和FileOutputStream 》
- ppp lcp协商报文有哪些_PPP 点到点协议
- 从零实现深度学习框架——逻辑回归简介
- stm32 PWM波
- 【JZOJ B组】【NOIP2013模拟】Heaven Cow与God Bull
- 静态函数和非静态函数的区别(静态方法和非静态方法)
- 火影推荐程序连载6-径向模糊简介
- Web全栈~06.CSS选择器
- 计算机为什么要采用精简指令集,为什么说手机cpu运行的是精简指令集,而电脑cpu是复杂指令集?...
- React最佳实践系列 —— 循序渐进理解 Dva中的model概念
- 【android工具篇】Firefly-RK系列(eg:RK3288 RK3368)一键获取root权限工具RootUtils
- 人生不是注定的--《千钧一发》观后感
- 决定执行力的49个细节(zt)
- 向U盘拷贝文件,总是提示对于目标系统,文件过大??
热门文章
- python异步爬虫_Python实现基于协程的异步爬虫
- spring 主从表_听听京东架构师浅谈,MySQL binlog 主从同步
- 若依集成jsencrypt实现密码加密传输方式
- apch连接mysql数据库连接_配置phpmyadmin连接远程 MySQL数据库
- [Ext JS]5.11 轻量版的树- treelist
- SpringBoot应用中JSP的角色及整合
- [设计模式-行为型]观察者模式(Observer)
- 山师计算机二级考试科目,山师计算机应用技术考试试题与答案.doc
- 易语言html实现报表打印,易语言报表统计功能例程可打印
- Eclipse中Java Web开发插件安装