"黑魔法"Method Swizzling和IMP指针
2015-09-07 17:54
423 查看
IMP指针
“黑魔法”Method Swizzling
以上代码实现的功能是在每个界面出现的时候添加一个友盟页面停留时间统计功能
typedef void (*_VIMP)(id, SEL, ...); @implementation UIViewController (category) + (void)load { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ // 获取原始方法 Method viewWillAppear = class_getInstanceMethod(self, @selector(viewWillAppear:)); // 获取方法的实现 _VIMP viewWillAppear_IMP = (_VIMP)method_getImplementation(viewWillAppear); // 重新设置方法实现 method_setImplementation(viewWillAppear, imp_implementationWithBlock(^(id target){ // 调用原有方法 viewWillAppear_IMP(target,@selector(viewWillAppear:)); [MobClick beginLogPageView:NSStringFromClass([target class])]; })); //TODO...可以自己添加viewWillDisappear等等 }); } @end
“黑魔法”Method Swizzling
@implementation UIViewController (category) + (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); swizzleMethod(class, @selector(viewDidLoad), @selector(aop_viewDidLoad)); swizzleMethod(class, @selector(viewDidAppear:), @selector(aop_viewDidAppear:)); swizzleMethod(class, @selector(viewWillAppear:), @selector(aop_viewWillAppear:)); swizzleMethod(class, @selector(viewWillDisappear:), @selector(aop_viewWillDisappear:)); }); } void swizzleMethod(Class class, SEL originalSelector, SEL swizzledSelector) { Method originalMethod = class_getInstanceMethod(class, originalSelector); Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector); BOOL didAddMethod = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)); if (didAddMethod) { class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)); } else { method_exchangeImplementations(originalMethod, swizzledMethod); } } - (void)aop_viewDidAppear:(BOOL)animated { [self aop_viewDidAppear:animated]; } -(void)aop_viewWillAppear:(BOOL)animated { [self aop_viewWillAppear:animated]; #ifndef DEBUG [MobClick beginLogPageView:NSStringFromClass([self class])]; #endif } -(void)aop_viewWillDisappear:(BOOL)animated { [self aop_viewWillDisappear:animated]; #ifndef DEBUG [MobClick endLogPageView:NSStringFromClass([self class])]; #endif } - (void)aop_viewDidLoad { [self aop_viewDidLoad]; } @end
以上代码实现的功能是在每个界面出现的时候添加一个友盟页面停留时间统计功能
相关文章推荐
- oracle中exp,imp的使用详解
- Oracle EXP和IMP用法和介绍
- 130313import导入小测
- Oracle导入程序Imp的使用详解
- exp/imp详解
- oracle数据库复制工具exp、imp 乱码问题与解决方法
- Oracle 数据库导入导出的脚本
- imp命令不能正常终止 提示"即将启用约束条件..."
- 关于CLASS , SEL, IMP的说明
- Oracle的exp/imp详解
- python: import模块的相关问题
- imp 全量导出,按用户导入
- 【Android基础学IOS开发】BOOL SEL IMP isa
- Oracle数据导入导出imp/exp?批处理文件
- oracle客户端备份导入导出数据库(exp,imp)
- imp使用touser导入表空间问题
- oracle 备份与恢复
- oracle 备份与恢复
- oracle 备份与恢复
- oracle 备份与恢复