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