您的位置:首页 > 编程语言

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: