Method Swizzling代码
2015-06-15 15:14
381 查看
参考上一篇:
.h文件
#import <UIKit/UIKit.h> @interface UIViewController (UIViewController_MRCUMAnalytics) @end
.m文件
#import "UIViewController+UIViewController_MRCUMAnalytics.h"
#import <objc/runtime.h>
@implementation UIViewController (UIViewController_MRCUMAnalytics)
+(void)load
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Class class = [self class];
// When swizzling a class method, use the following:
// Class class = object_getClass((id)self);
//出现1
SEL originalAppearSelector = @selector(viewWillAppear:);
SEL swizzledAppearSelector = @selector(umeng_viewWillAppear:);
//消失1
SEL originalDisappearSelector = @selector(viewWillDisappear:);
SEL swizzledDisappearSelector = @selector(umeng_viewWillDisappear:);
//出现2
Method originalAppearMethod = class_getInstanceMethod(class, originalAppearSelector);
Method swizzledAppearMethod = class_getInstanceMethod(class, swizzledAppearSelector);
//消失2
Method originalDisappearMethod = class_getInstanceMethod(class, originalDisappearSelector);
Method swizzledDisappearMethod = class_getInstanceMethod(class, swizzledDisappearSelector);
//替换viewWillAppear方法
BOOL didAddMethod = class_addMethod(class, originalAppearSelector, method_getImplementation(swizzledAppearMethod), method_getTypeEncoding(swizzledAppearMethod));
if (didAddMethod) {
class_replaceMethod(class,
swizzledAppearSelector,
method_getImplementation(originalAppearMethod),
method_getTypeEncoding(originalAppearMethod));
} else {
method_exchangeImplementations(originalAppearMethod, swizzledAppearMethod);
}
//替换viewWillDisappear方法
BOOL didChangeMethod = class_addMethod(class, originalDisappearSelector, method_getImplementation(swizzledDisappearMethod), method_getTypeEncoding(swizzledDisappearMethod));
if (didChangeMethod) {
class_replaceMethod(class,
swizzledDisappearSelector,
method_getImplementation(originalDisappearMethod),
method_getTypeEncoding(originalDisappearMethod));
} else {
method_exchangeImplementations(originalDisappearMethod, swizzledDisappearMethod);
}
});
}
#pragma mark - Method Swizzling
- (void)umeng_viewWillAppear:(BOOL)animated {
[self umeng_viewWillAppear:animated];
[MobClick beginLogPageView:NSStringFromClass([self class])];
}
- (void)umeng_viewWillDisappear:(BOOL)animated {
[self umeng_viewWillDisappear:animated];
[MobClick endLogPageView:NSStringFromClass([self class])];
}
@end
相关文章推荐
- java 慎用ArrayList的contains方法,使用HashSet的contains方法代替
- php实现求相对时间函数
- 用maven+springMVC创建一个项目
- PHP调试器phpstrom安装,配置教程
- Lua与C——调用Lua函数(三)
- Spring-ldap 操作LDAP
- php中new对象加括号和不加括号的区别
- 简单实例: 基于Struts2的登录系统
- struts2上传文件添加进度条
- JDK自带的动态代理Proxy类和InvocationHandler接口
- Yii中relations里配置和一些个人经验
- 返回顶部代码!
- python备份mysql脚本
- Java程序员学习C++之常量指针和指针常量
- 萃取(traits)编程技术的介绍和应用
- 基于PHP扩展一种处理Emoji方法的类库介绍【Carmela】
- 1. Laravel5学习笔记:Composer.json配置文件说明
- 修改repeater控件里面某项的值
- MyEclipse + Maven开发Web工程的详细配置过程
- Android SDK(版本2.3-5.1),搭建完好的eclipse+Android开发环境