Method Swizzling通俗的讲就是交换两个selector的实现,通过这种方式,可以实现给方法hook的目的。
使用Method Swizzling比较常见的方式就是通过category给常用类加入自己的hook方法,以达到复用的效果。
比如我们想给UITableView的reloadData方法hook一个print的方法来追踪。
则我们可以,
#import <objc/runtime.h>
@implementation UITableView (MyTrace)
+ (void)load
{
Method_exchangeImplementations(class_getInstanceMethod(self, @selector(reloadData)),
class_getInstanceMethod(self, @selector(my_reloadData)));
}
- (void)my_reloadData
{
[self my_reloadData];
[self myPrint];
}
- (void)myPrint
{
NSLog("TableView reloadData");
}
@end
这样,我们每次调用reloadData的时候,就都会打印TableView reloadData。
这里面主要有2个方法
当然runtime中还有其他方法,例如
Method_exchangeImplementations //交换两个方法的实现
class_getInstanceMethod //得到类方法
class_replaceMethod 来修改类,
method_setImplementation 来直接设置某个方法的IMP
其说明可以通过
#import <objc/runtime.h>
去看注释