注意在Category中复写方法

来源:互联网 发布:软件分解 编辑:程序博客网 时间:2024/05/16 09:26

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:反而会递归调用造成死循环。    }


0 0
原创粉丝点击