在load方法中,用fc_viewDidLoad替换viewDidLoad:
/** * 在load中交换viewDidLoad和fc_viewDidLoad */ +(void)load{ static dispatch_once_t onceToken; dispatch_once(&onceToken,^{ xgf_swizzleSelector([self class], @selector(viewDidLoad), @selector(xgf_viewDidLoad)); /*Method m1=class_getInstanceMethod([self class], @selector(viewDidLoad)); Method m2=class_getInstanceMethod([self class], @selector(fc_viewDidLoad)); BOOL notImplemented=class_addMethod([self class], @selector(viewDidLoad), method_getImplementation(m2), method_getTypeEncoding(m2)); if(!notImplemented){ method_exchangeImplementations(m1, m2); } */ }); } static inline void xgf_swizzleSelector(Class class,SEL originalSelector,SEL swizzledSelector){ Method originalMethod=class_getInstanceMethod(class, originalSelector); Method swizzledMethod=class_getInstanceMethod(class, swizzledSelector); if(class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))){ class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)); }else{ method_exchangeImplementations(originalMethod, swizzledMethod); } }
/** * [self xgf_viewDidLoad] 其实是调用了viewDidLoad的实现 */ -(void)xgf_viewDidLoad{ NSLog(@"%s",__func__); [self xgf_viewDidLoad]; }