运行时Runtime演示方法交换
原创
©著作权归作者所有:来自51CTO博客作者wx6103b5205e184的原创作品,请联系作者获取转载授权,否则将追究法律责任
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文件即可。