本文介绍了如果我覆盖一个类方法,有没有办法可以调用原始方法(被覆盖的方法)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在Objective-C中,如果我使用类别覆盖类方法,有没有办法可以调用原始方法(被覆盖的方法)?
In Objective-C, if I override a class method using a category, is there a way I can call the original method (the one that was overridden)?
推荐答案
我在 +(void)load
中为您提供三种方法。在每种情况下,请将方法命名为MyCategory_method左右。
I present you with three icky ways to do this in +(void)load
. In every case, name your method MyCategory_method or so.
- class_getMethodImplementation()和class_replaceMethod()。存储旧的IMP,并直接调用它。您需要获取方法的类型编码。请注意,您也可以使用普通的C函数...
- class_getInstanceMethod(),method_getImplementation(),method_setImplementation()。如上所述,但您不需要获取方法的类型编码。 两个方法上的
- class_getInstanceMethod(),然后是method_exchangeImplementations()。调用MyCategory_method以获取原始实现。这是最简单的方法。
- class_getMethodImplementation() and class_replaceMethod(). Store the old IMP, and call it directly. You need to get the method's type encoding. Note that you can just use a normal C function too...
- class_getInstanceMethod(), method_getImplementation(), method_setImplementation(). As above, but you don't need to get the method's type encoding.
- class_getInstanceMethod() on both methods, and then method_exchangeImplementations(). Call MyCategory_method to get the original implementation. This is the easiest way to do it.
有时候,这是让它做你想做的唯一合理的方法...
Sometimes, it's the only reasonably easy way to make it do what you want...
编辑:只有当你知道自己在做什么时才这样做!
And only do this if you know what you're doing!
这篇关于如果我覆盖一个类方法,有没有办法可以调用原始方法(被覆盖的方法)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!