您的位置:首页 > 其它

"黑魔法"Method Swizzling和IMP指针

2015-09-07 17:54 423 查看
IMP指针

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


以上代码实现的功能是在每个界面出现的时候添加一个友盟页面停留时间统计功能
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  IMP 黑魔法 Swizzling