Objective-C的Category可以使我们很方便的扩展已有的类,但是仅限于扩展新的方法。
如果想要复写旧的方法,像这样
- (void)setEnabled:(BOOL)enabled
[super setEnabled:enabled];
// something other to do.
}
看起来没有什么问题,编译器也正常编译通过了。
但事实是,旧的setEnabled永远也不会调用到了。
如果真的想复写就的方法,需要使用swizzle_method动态替换方法。
+ (void)load {
Method original, swizzle;
original = class_getInstanceMethod(self, @selector(setEnabled:));
swizzle = class_getInstanceMethod(self, @selector(swizzle_setEnabled:));
method_exchangeImplementations(original, swizzle);
}
- (void)swizzle_setEnabled:(BOOL)enabled {
[self swizzle_setEnabled:enabled];
// something other to do.
//放心在swizzle_setEnabled:方法中调用swizzle_setEnable:,这样并不会递归调用
//,因为在运行时setEnabled:和swizzle_setEnabled:已经调换了,如果这里调用setEnabled:反而会递归调用造成死循环。
}