1.方法的交换
//+ (void)load{
// // 方法交换应该被保证,在程序中只会执行一次
// static dispatch_once_t onceToken;
// dispatch_once(&onceToken, ^{
// // 获得 viewController 的生命周期方法的 selector
// SEL systemSel = @selector(viewWillAppear:);
// // 自己实现的将要被交换的方法的 selector
// // 方法交换应该被保证,在程序中只会执行一次
// static dispatch_once_t onceToken;
// dispatch_once(&onceToken, ^{
// // 获得 viewController 的生命周期方法的 selector
// SEL systemSel = @selector(viewWillAppear:);
// // 自己实现的将要被交换的方法的 selector
// SEL swizzSel = @selector(swiz_viewWillAppear:);
// //两个方法的Method
// Method systemMethod = class_getInstanceMethod([self class], systemSel);
// Method swizzMethod = class_getInstanceMethod([self class], swizzSel);
// Method systemMethod = class_getInstanceMethod([self class], systemSel);
// Method swizzMethod = class_getInstanceMethod([self class], swizzSel);
// //
首先动态添加方法,实现是被交换的方法,返回值表示添加成功还是失败
// BOOL isAdd = class_addMethod(self, systemSel, method_getImplementation(swizzMethod), method_getTypeEncoding(swizzMethod));
// if (isAdd) {
// //
如果成功,说明类中不存在这个方法的实现,系统的方法没有复写,方法名是唯一识别
// //将被交换方法的实现替换到这个并不存在的实现
// class_replaceMethod(self, swizzSel, method_getImplementation(systemMethod), method_getTypeEncoding(systemMethod));
// }else{
// //否则,交换两个方法的实现
// method_exchangeImplementations(systemMethod, swizzMethod);
// }
// });
//}
//
// class_replaceMethod(self, swizzSel, method_getImplementation(systemMethod), method_getTypeEncoding(systemMethod));
// }else{
// //否则,交换两个方法的实现
// method_exchangeImplementations(systemMethod, swizzMethod);
// }
// });
//}
//
//因为已经在load方法中实现了方法实现的交换,当调用viewWillAppear方法的时候执行下面的方法体,方法体中对自己的调用实际上执行的是viewWillAppear的方法体
//- (void)swiz_viewWillAppear:(BOOL)animated{
// //
这时候调用自己,看起来像是死循环
// //
但是其实自己的实现已经被替换了
//下面两行代码可以交换实现不同的调用顺序
// [self swiz_viewWillAppear:animated];
// NSLog(@"swizzle");
//}
//