iOS Swizzle 方法出现问题.

我通过以下方式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的各种方法的运行时间.

     [super viewWillAppear:animated];

此时执行父类的方法,会被替换到你的_swizzle_viewWillAppear方法里 传进来的self是你的子类
此时不会再次调用子类的viewWillAppear方法

    NSDate *start = [NSDate date];
    NSLog(@"%@start%@",self,start);

    
    void (*ori_imp)(id, SEL, BOOL) = (void(*)(id, SEL, BOOL))_original_viewWillAppear;
    ori_imp(self, _cmd, animated);
    
  //可以试着替换下方法 就可以了例如切换到viewDidAppear中 sleep
  //   IMP imp = class_getMethodImplementation([self class], @selector(viewDidAppear:));
  //   void (*ori_imp)(id, SEL, BOOL) = (void(*)(id, SEL, BOOL))imp;
  //   ori_imp(self, _cmd, animated);
    
    
    NSDate *end = [NSDate date];
    NSLog(@"%@end%@",self,end);
    NSTimeInterval elapsed = [end timeIntervalSinceDate:start];
    NSLog(@"Elapsed:%f(s)",elapsed);
  • tableView怎么把系统的左滑删除变成图片,并且可以自定义高度?
  • 一个在iphone5 和 iphone6 下显示不同效果的问题
  • APP放置3天到一周,再次启动会很慢。
  • 为什么同一段drawrect中的代码,在不同的环境下运行效率不同
  • 关于七牛上传图片是否有数量限制问题
  • Safari可以显示输入一位数键盘焦点自动切换到下一个输入框的效果 而在UIWebView里面没有
  • ios NSXMLDocument 为什么报错 ,需要导入什么框架 包 啊
  • 如何获得UITableViewCell 在屏幕中的位置
  • initialize和load的区别
  • iOS中通过segue传值的问题
  • APP HTTPS协议抓包难题