method_exchangeImplementations作用:method_exchangeImplementations可以交換兩個方法的具體實現(xiàn)恋拷,先舉個例子,再解釋涌乳。
@implementation ViewController
- (void)viewDidLoad
{
? ? ? ?[super viewDidLoad];
? ? ? ?[self methodExchange];
? ? ? ?[self method1];
? ? ? ?[self method2];
}
-(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和么thod的IMP指針瞒滴,(IMP代表了方法的具體的實現(xiàn)) ?
? ? ? ?method_exchangeImplementations(method1, method2);
}
@end
運(yùn)行截圖如下:
[self method1]輸出method2,[self method2]輸出method1肉迫。
原理如下:
@selector(method1) ------->IMP1(函數(shù)指針,具體實現(xiàn)輸出么method1)
@selector(method2) ------->IMP1(函數(shù)指針稿黄,具體實現(xiàn)輸出么method2)
當(dāng)執(zhí)行method_exchangeImplementations(method1, method2)變成如下:
@selector(method1) ------->IMP2(函數(shù)指針喊衫,具體實現(xiàn)輸出么method2)
@selector(method2) ------->IMP1(函數(shù)指針,具體實現(xiàn)輸出么method1)
所以杆怕,[self method1]輸出method2族购,[self method2]輸出method1。