1.什么是Method Swizzle(黑魔法)
从字面意思上看,就是方法混淆的意思。大家对它的理解性定义为:改变一个已存在的选择器对应的实现的过程,它依赖于Objectvie-C中方法的调用能够在运行时进改变——通过改变类的调度表(dispatch table)中选择器到最终函数间的映射关系。
实际上它是通过指针调换的方式,将某个类的方法A对应的指针指向我们自己写的一个方法B,将我们自己写的方法B对应的指针指向方法A,看看下面图的图示:
2.友盟统计实例
已下是实现友盟统计的具体实现,这里可以根据需求过滤掉一下类的统计
这里用到一个已经比较成熟的第三方JRSwizzle,当然自己写也可以,没几行代码
#import "UIViewController+WJSwizzle.h"
#import "JRSwizzle.h"
#import "MobClick.h"
@implementation UIViewController (WJSwizzle)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSError *err1 = nil,*err2 = nil;
[self jr_swizzleMethod:@selector(viewDidAppear:)
withMethod:@selector(swizzle_viewDidAppear:)
error:&err1];
[self jr_swizzleMethod:@selector(viewDidDisappear:)
withMethod:@selector(swizzle_viewDidDisappear:)
error:&err2];
if (err1) NSLog(@"页面统计发生错误(%@):%@",
[self description], err1.localizedDescription);
if (err2) NSLog(@"页面统计发生错误(%@):%@",
[self description], err2.localizedDescription);
});
}
- (void)swizzle_viewDidAppear:(BOOL)animated {
[MobClick beginLogPageView:[self.class description]];
[self swizzle_viewDidAppear:animated];
}
- (void)swizzle_viewDidDisappear:(BOOL)animated {
[MobClick endLogPageView:[self.class description]];
[self swizzle_viewDidDisappear:animated];
}
@end