我通过以下方式hook方法,
static IMP _original_viewWillAppear;
void _swizzle_viewWillAppear(id self, SEL _cmd, BOOL animated) {
NSDate *start = [NSDate date];
void (*ori_imp)(id, SEL, BOOL) = (void(*)(id, SEL, BOOL))_original_viewWillAppear;
ori_imp(self, _cmd, animated);
NSDate *end = [NSDate date];
NSTimeInterval elapsed = [end timeIntervalSinceDate:start];
NSLog(@"Elapsed:%f(s)",elapsed);
}
@implementation UIViewControllerTrace
+ (void)startTrace {
Method ori = class_getInstanceMethod([UIViewController class], @selector(viewDidLoad));
_original_viewDidLoad = method_setImplementation(ori, (IMP)_swizzle_ViewDidLoad);
ori = class_getInstanceMethod([UIViewController class], @selector(viewWillAppear:));
_original_viewWillAppear = method_setImplementation(ori, (IMP)_swizzle_viewWillAppear);
}
ViewController
的方法:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
sleep(2);
}
我在viewWillAppear
sleep多少, hook方法的log都是错误的.
请问为什么会这样?
最好找到了一个解决方法, 参照了
PonyDebugger
的网络监控实现方法, 使用rumtime去hook所有类(当然需要去掉一些系统自带的UIViewController
). 然后就可以统计到VC的各种方法的运行时间.