由于项目需要,实现了一个方法替换函数,比如这样子就可以用自己的方法去替代框架提供的默认的方法了:
void MethodSwizzle(Class aClass, SEL orig_sel, SEL alt_sel) {
Method orig_method = nil, alt_method = nil;
orig_method = class_getInstanceMethod(aClass, orig_sel);
alt_method = class_getInstanceMethod(aClass, alt_sel);
if ((orig_method != nil) && (alt_method != nil))
{
IMP originIMP = method_getImplementation(orig_method);
IMP altIMP = method_setImplementation(alt_method, originIMP);
method_setImplementation(orig_method, altIMP);
}
}
使用方法,比如:
+ (void)changeSetFontImplementation {
MethodSwizzle([self class], @selector(setFont:), @selector(customSetFont:));
}
假如上面这个方法是UILabel的类别中的方法,那么我们可以在- (void)applicationDidFinishLaunching:(UIApplication *)application中这样调用:
[UILabel changeSetFontImplementation];
如此,整个工程中的.text=所调用的方法就是自己实现的方法了。
enjoy : )