gpt4 book ai didi

ios - 使用 class_getInstanceMethod - 在类层次结构中实现的方法在哪里?

转载 作者:可可西里 更新时间:2023-11-01 03:06:01 25 4
gpt4 key购买 nike

是否有可能找到类层次结构中由 class_getInstanceMethod 检索的方法来自何处?例如,假设 A 类实现了 myMethod。现在说我已经将 A 类分类为 A1 类。如果我调用 class_getInstanceMethod(ClassA1, myMethod),是否可以判断生成的方法是在 ClassA1 中被覆盖还是直接来自 A1?

我想如果您可以同时访问 ClassA 和 ClassA1,那么比较 IMP 的内存地址是可能的,但我没有直接访问 A 的权限。

最佳答案

您始终可以访问类的父类(super class),因此您可以使用相同的 SEL 将其传递给 class_getInstanceMethodclass_getMethodImplementation 并比较IMP 地址以查看该方法是否被子类覆盖。

如果您想获取定义此方法的根类,这会有点复杂。

无论如何,这里是:

static inline BOOL isInstanceMethodOverridden(Class cls, SEL selector, Class *rootImpClass) {
IMP selfMethod = class_getMethodImplementation(cls, selector);
BOOL overridden = NO;
Class superclass = [cls superclass];
while(superclass && [superclass superclass]) {
IMP superMethod = class_getMethodImplementation(superclass, selector);
if(superMethod && superMethod != selfMethod) {
overridden = YES;
if(!rootImpClass) {
//No need to continue walking hierarchy
break;
}
}

if(!superMethod && [cls respondsToSelector:selector])) {
//We're at the root class for this method
if(rootImpClass) *rootImpClass = cls;
break;
}

cls = superclass;
superclass = [cls superclass];
}

return overridden;
}

关于ios - 使用 class_getInstanceMethod - 在类层次结构中实现的方法在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15909539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com