1,全局统计用户进入页面的次数
创建UIViewController分类替换ViewDidLoad方法实现
#import <Foundation/Foundation.h>
@interface NSObject (Swizzling)
+(void)methodSwizzlingWithOriginalSelector:(SEL)originalSelector bySwizzledSelector:(SEL)swizzledSelector;
@end
#import "NSObject+Swizzling.h"
#import <objc/runtime.h>
@implementation NSObject (Swizzling)
+(void)methodSwizzlingWithOriginalSelector:(SEL)originalSelector
bySwizzledSelector:(SEL)swizzledSelector{
Class class = [self class];
Method originalMethod = class_getInstanceMethod(class, originalSelector);
Method swizzleMethod = class_getInstanceMethod(class, swizzledSelector);
BOOL didAddMethod = class_addMethod(class, originalSelector, method_getImplementation(swizzleMethod), method_getTypeEncoding(swizzleMethod));
if (didAddMethod) {
class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
}else{
method_exchangeImplementations(originalMethod, swizzleMethod);
}
}
@end
@implementation UIViewController (Swizzling)
+(void)load{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
[UIViewController methodSwizzlingWithOriginalSelector:@selector(viewDidLoad)
bySwizzledSelector:@selector(swizzling_viewDidLoad)];
});
}
-(void) swizzling_viewDidLoad{
[self viewDidLoad];
NSLog(@"===== %@ viewDidAppear=====",[self class]);
}
@end
Swizzling应该总在+load中执行
在OC中,Runtime会在类初始加载时调用+load方法,在类第一次被调用时实现+initialize方法。由于Method Swizzling会影响到类的全局状态,所以要尽量避免在并发处理中出现竞争情况。+load方法能保证在类的初始化过程中被加载,并保证这种改变应用级别的行为的一致性。
要使用dispatch_once执行方法交换
方法交换要求线程安全,而且保证在任何情况下只能交换一次。
网友评论