objective-c - iOS Swizzle 方法出现问题.
怪我咯
怪我咯 2017-04-17 16:46:04
[iOS讨论组]

我通过以下方式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都是错误的.

请问为什么会这样?

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(2)
巴扎黑

最好找到了一个解决方法, 参照了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);
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号