OC 对同一个方法进行多次交换(Method Swilzzling)

Method Swizzing主要用于在运行时将两个Method进行交换.例如:交换实例方法:

    Method originMethod = class_getInstanceMethod(target, originalSelector);

    Method swizzledMethod = class_getInstanceMethod(target, swizzledSelector);

    method_exchangeImplementations(originMethod, swizzledMethod);

交换类方法

    Method originMethod = class_getClassMethod(target, originalSelector);

    Method swizzledMethod = class_getClassMethod(target, swizzledSelector);

    method_exchangeImplementations(originMethod, swizzledMethod);

如果有系统方法A,下面有两个自定义方法B和C都对A进行交换是什么效果呢?

-(void) B{

    [self B]

    printf("B");

}

-(void) C{

    [self C]

    printf("C");

}

看一下交换的过程 A和B交换后:

selector A ↘            ↗IMPa

                        ↘↗

selector B   ↗      ↘    IMPb

selector C → → →  IMPc

A和C交换后

selector A ↘                ↗IMPa

                      ↘    ↗ 

selector B   ↗  ↘      ↗   IMPb

                          ↗↘

selector C ↗             ↘   IMPc

程序执行到 A()的时候,执行IMPc函数指针,IMPc中有C()调用,实际执行IMPb的函数指针,IMPb中有B()的调用,实际执行IMPa的系统方法。所以依次打印出B,C

在一个函数总展开则是这样:

IMPc{

    IMPb{

        IMPa{};

        prinitf("B");

    }

     printf("C");

}

 

 

 

你可能感兴趣的:(Objective-C高效编程)