執行時Runtime演示方法交換
阿新 • • 發佈:2020-10-10
1、按鈕分類
- 演示給整個工程中的按鈕新增點選音效。
- 寫一個分類,重寫類的 load方法。
#import "UIButton+CH.h" #import <objc/runtime.h> @implementation UIButton (CH) + (void)load { [super load]; // 這個是系統原有的方法 Method oldObjectAtIndex = class_getInstanceMethod([UIButton class], @selector(sendAction:to:forEvent:)); // 自定義的方法 Method newObjectAtIndex = class_getInstanceMethod([UIButton class], @selector(custom_sendAction:to:forEvent:)); // 交換方法 method_exchangeImplementations(oldObjectAtIndex, newObjectAtIndex); } - (void)custom_sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event { // 可條件選擇走系統方法 [self custom_sendAction:action to:target forEvent:event]; [CHTool playSoundEffect:@"music3" withType:VoiceTypeIsMp3]; CHLog(@"捕捉所有按鈕事件"); } @end
- 要使在整個工程中生效,將該分類的標頭檔案新增到工程的Pch檔案即可。
2、記錄NSMutableArray新增的每一個物件
#import <objc/runtime.h> @implementation NSMutableArray (LoggingAddObject) + (void)load { Method addobject = class_getInstanceMethod(self, @selector(addObject:)); Method logAddobject = class_getInstanceMethod(self, @selector(logAddObject:)); method_exchangeImplementations(addObject, logAddObject); } - (void)logAddObject:(id)aobject { [self logAddObject:aObject]; NSLog(@"Added object %@ to array %@", aObject, self); } @end
- 要使在整個工程中生效,將該分類的標頭檔案新增到工程的Pch檔案即可。