Objective-C RunTime

9.28 runtime hook散记

2016-09-28  本文已影响17人  jayck

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了。

上一篇 下一篇

猜你喜欢

热点阅读