通過修改一個(gè)已存在類的方法, 來(lái)實(shí)現(xiàn)方法替換是比較常用的runtime技巧有缆。
使所有的類都具有調(diào)換方法的功能:
#import <Foundation/Foundation.h>
@interface NSObject (SwzillingMethod)
+ (void)swzillingOriginSel:(SEL)originSel withSwizzlingSel:(SEL)newSel;
@end
#import "NSObject+SwzillingMethod.h"
#import <objc/runtime.h>
@implementation NSObject (SwzillingMethod)
+ (void)swzillingOriginSel:(SEL)originSel withSwizzlingSel:(SEL)newSel{
Method originM =class_getInstanceMethod([self class], originSel);
Method newM=class_getInstanceMethod([self class], newSel);
method_exchangeImplementations(originM, newM); // 方法調(diào)換
}
@end
需求:調(diào)換UIViewController類系統(tǒng)的ViewWillAppear方法,自定義ViewWillAppear方法
#import <UIKit/UIKit.h>
@interface UIViewController (ViewWillAppear)
@end
#import "UIViewController+ViewWillAppear.h"
#import "NSObject+SwzillingMethod.h"
@implementation UIViewController (ViewWillAppear)
+ (void)load{
static ?dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
[self ?swzillingOriginSel:@selector(viewWillAppear:) withSwizzlingSel:@selector(zn_viewWillAppear:)];
});
}
// 自定義ViewWillAppear方法的實(shí)現(xiàn)
- (void)zn_viewWillAppear:(BOOL)animated{
// 實(shí)現(xiàn)部分自定義,需要在UIViewController類的ViewWillAppear方法中做什么就寫啥
NSString*name =NSStringFromClass([self class]);
// 實(shí)現(xiàn):使得類名為ViewController的類中視圖背景色為紅色
if([name isEqualToString:@"ViewController"]){
self.view.backgroundColor= [UIColorredColor]; ?
}
//這個(gè)一定要切記切記切記!(與重寫ViewWillAppear方法類似)
[self ?zn_viewWillAppear:animated];
}
@end