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简单的使用解决实际问题(交换方法)相关推荐

  1. [Runtime]-交换方法

    为什么80%的码农都做不了架构师?>>>    1:比如我们有个需求:让UIImage加载图片的时候,告诉我们是否加载成功了 前言: /**  Runtime(交换方法):只要是想修 ...

  2. iOS项目之交换方法(runtime)

    在项目中,经常会遇到系统自带的方法满足不了自己的需求,往往我们解决这种情况的时候,都是在分类中添加一个方法.然而很多时候,项目已经开发很长时间了,如果一个一个的去替换系统的方法,太浪费宝贵的时间,所以 ...

  3. 用计算机处理信息的例子,用计算机解决生活中实际问题的方法--

    适用范围:高二年级下期<算法与程序设计>(选修模块) 课时:1课时 一.教学目标 1.课程标准中的相关内容 课程标准在<算法与程序设计>模块中有如下阐述:"教师应引导 ...

  4. 用计算机解决生活中实际问题的方法,用计算机解决生活中实际问题的方法--

    用计算机解决生活中实际问题的方法-- 适用范围:高二年级下期<算法与程序设计>(选修模块) 课时:1课时 一.教学目标 1.课程标准中的相关内容 课程标准在<算法与程序设计>模 ...

  5. Linux安装软件时缺少依赖包的简单较完美解决方法!

    Linux安装软件时缺少依赖包的简单较完美解决方法! 参考文章: (1)Linux安装软件时缺少依赖包的简单较完美解决方法! (2)https://www.cnblogs.com/xiaommvik/ ...

  6. PHP:使用Zend对源码加密、Zend Guard安装以及Zend Guard Run-time support missing的解决方法

    PHP:使用Zend对源码加密.Zend Guard安装以及Zend Guard Run-time support missing的解决方法 参考文章: (1)PHP:使用Zend对源码加密.Zend ...

  7. 计算机简单故障时的排除方法,电脑简单故障排除解决办法大全

    电脑简单故障排除解决办法大全 一.电脑罢 工了?听报警声就可以处理故障! 在使用电脑的时候,我们会经常遇到开机时电脑黑屏没有反应的情况,普通的电脑用户而对这样的故障实在是无从下手,但是一般电脑会有一个 ...

  8. html webservice数据交互_一种基于WebService的数据交换方法

    一种基于WebService的数据交换方法 [专利摘要]本发明涉及数据交换[技术领域],特别涉及一种基于WebService的数据交换方法.本发明是以Web服务为依托,通过定义参数的方式进行传入内容和 ...

  9. 运用《深入理解Java虚拟机》书中知识解决实际问题

    前言 以前看别人博客说看完<深入理解Java虚拟机>这本书并没有让自己的编程水平提高多少,不过却大大提高了自己的装逼水平.其实,我倒不这么认为,至少在我看完一遍这本书后,有一种醍醐灌顶的感 ...

最新文章

  1. 一文揭秘领域驱动设计(DDD):领域和子域!
  2. 用Delphi设计能携带附件的EMail
  3. 沃流量 android,沃流量管家的身世之谜
  4. 1003. [ZJOI2006]物流运输【区间DP+最短路】
  5. 【干货】mysql建表语句注释
  6. [css] 说说你对相对定位、绝对定位、固定定位的理解
  7. J03-Java IO流总结三 《 FileInputStream和FileOutputStream 》
  8. ppp lcp协商报文有哪些_PPP 点到点协议
  9. 从零实现深度学习框架——逻辑回归简介
  10. stm32 PWM波
  11. 【JZOJ B组】【NOIP2013模拟】Heaven Cow与God Bull
  12. 静态函数和非静态函数的区别(静态方法和非静态方法)
  13. 火影推荐程序连载6-径向模糊简介
  14. Web全栈~06.CSS选择器
  15. 计算机为什么要采用精简指令集,为什么说手机cpu运行的是精简指令集,而电脑cpu是复杂指令集?...
  16. React最佳实践系列 —— 循序渐进理解 Dva中的model概念
  17. 【android工具篇】Firefly-RK系列(eg:RK3288 RK3368)一键获取root权限工具RootUtils
  18. 人生不是注定的--《千钧一发》观后感
  19. 决定执行力的49个细节(zt)
  20. 向U盘拷贝文件,总是提示对于目标系统,文件过大??

热门文章

  1. python异步爬虫_Python实现基于协程的异步爬虫
  2. spring 主从表_听听京东架构师浅谈,MySQL binlog 主从同步
  3. 若依集成jsencrypt实现密码加密传输方式
  4. apch连接mysql数据库连接_配置phpmyadmin连接远程 MySQL数据库
  5. [Ext JS]5.11 轻量版的树- treelist
  6. SpringBoot应用中JSP的角色及整合
  7. [设计模式-行为型]观察者模式(Observer)
  8. 山师计算机二级考试科目,山师计算机应用技术考试试题与答案.doc
  9. 易语言html实现报表打印,易语言报表统计功能例程可打印
  10. Eclipse中Java Web开发插件安装