美文网首页Objective-C RunTime
9.28 runtime hook散记

9.28 runtime hook散记

作者: jayck | 来源:发表于2016-09-28 20:30 被阅读17次

    runtime

    runtime是一种机制,比如一个老板做好一道菜。如果你会用runtime,就如你可以自己加自己的调料、配料,做出属于自己的味道。而且如果写的好,可能做出另外一道菜。

    如果A = 1, B = 2; A是系统或者同事写的,B是自己写的。
    交换AB里的值

    hook 钩子方法

    Aspects框架: https://github.com/steipete/Aspects
    下载后直接把.h .m 文件拖到我们的工程里面就可以使用了

    如果A方法执行完,我们执行Z方法,可是我们并不知道A方法什么时候执行,这是问题所在。这个时候我们就可以用hook,用Z勾住A,让A执行完执行Z。

    
    UIView *v = [UIView new];
    
        [self.view addSubview:v];
    
        [v aspect_hookSelector:NSSelectorFromString(@"dealloc") withOptions:AspectPositionBefore usingBlock:^{
        
            NSLog(@"---->dealloc");
            
        } error:nil];
        
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            
            [self demoFunc];
        });
    
    //没有更改demoFunc里的任何代码,但是我们用了hook,已经在它之前执行了我们的方法。
    - (void)demoFunc{
    
        NSLog(@"niubility");
    
    }
    
    
    

    Animal类里有个animalFunc方法,但是没有接口,怎么调用?

    performSelector强制调用!

    [selector performSelector:@selector(animalFunc)];
    

    "临终遗言"

    如果一个方法没有实现,会挂掉。那么在挂掉之前我们也得打印点东西。

    NSSelectorFromString(@"dealloc")强制将字符串转成SEL.
    - (void)doesNotRecognizeSelector:(SEL)aSelector{
        NSLog(@"im secondFunc, im crashing......");
    }
    

    如果没有实现(挂掉之前,"临终遗言"),就执行里面的方法。
    找BUG用:比如别人用你的程序发现一个BUG,但是你自己用没有这个BUG。我们可以用这个方法,在他某个方法挂掉之前,执行这个方法,把里面的错误信息,写成日志,保存在本地。再写个方法发送错误信息给我们自己,这样就比较容易找BUG了。

    相关文章

      网友评论

        本文标题:9.28 runtime hook散记

        本文链接:https://www.haomeiwen.com/subject/wvhkyttx.html