1. 程式人生 > 實用技巧 >執行時Runtime演示方法交換

執行時Runtime演示方法交換

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檔案即可。