Method Swizzling

  • Method Swizzling 即在运行期间交换方法实现。

例如下面例子:

- (void) method1 {
    NSLog(@"method1");
}

- (void) method2 {
    NSLog(@"method2");
}

-(void)methodExchange

{
    Method method1 = class_getInstanceMethod([self class], @selector(method1));
    Method method2 = class_getInstanceMethod([self class], @selector(method2));
    
    //交换method1和method2的IMP指针,(IMP代表了方法的具体的实现)
    method_exchangeImplementations(method1, method2);
}

执行调用:

    [self methodExchange];
    [self method1];
    [self method2];

最后打印:

method2
method1
  • 应用场景

Method Swizzling的使用场景可以在分类中修改原类的方法实现。例如在MJRefresh中,实现了每次执行完UIScrollView自己的方法reloadData后执行[self executeReloadDataBlock]。

@implementation UITableView (MJRefresh)

+ (void)load
{
    [self exchangeInstanceMethod1:@selector(reloadData) method2:@selector(mj_reloadData)];
}

- (void)mj_reloadData
{
    [self mj_reloadData];
    
    [self executeReloadDataBlock];
}
@end

参考文档:
轻松学习之 IMP指针的作用

你可能感兴趣的:(Method Swizzling)