gpt4 book ai didi

objective-c - 如何调用super.super的方法?

转载 作者:IT王子 更新时间:2023-10-29 07:52:48 26 4
gpt4 key购买 nike

我想在不破坏继承链的情况下调用父类(super class)的父类(super class)方法。像这样:

+(id) alloc 
{
return [super.super alloc];
}

有办法实现吗?

不要与 superclass 方法提供的行为混淆,已讨论 here .


更新:

关于 supersuperclass 区别的几句话。

比方说,我们有AClassSuperAClass。从它们的名字来看AClass继承了SuperAClass。它们每个都有一个方法的实现 -(void) foo;

AClass 实现其中一个以下类方法:

<强>1。父类(super class):

+(id) alloc {
return [[self superclass] alloc];
}

<强>2。 super :

+(id) alloc {
return [super alloc];
}

现在,假设这两行代码:

AClass *AClassInstance = [AClass alloc];
[AClassInstance foo];

在第一种情况下(使用父类(super class)),SuperAClassfoo 方法将被调用。对于第二种情况(使用 super),将调用 AClassfoo 方法。

最佳答案

在您的特定示例中,+superclass 实际上是要走的路:

+ (id)someClassMethod {
return [[[self superclass] superclass] someClassMethod];
}

因为它是一个类方法,因此self 指的是定义+someClassMethod 的类对象。

另一方面,实例方法中的事情变得有点复杂。一种解决方案是获取指向 supersuper(祖 parent )类中方法实现的指针。例如:

- (id)someInstanceMethod {
Class granny = [[self superclass] superclass];
IMP grannyImp = class_getMethodImplementation(granny, _cmd);
return grannyImp(self, _cmd);
}

与类方法示例类似,发送两次+superclass获取supersuperclass。 IMP是一个指向方法的指针,我们得到一个IMP指向与当前方法同名的方法(-someInstaceMethod),但指向方法中的实现supersuperclass,然后调用它。请注意,如果存在与 id 不同的方法参数和返回值,您需要对此进行调整。

关于objective-c - 如何调用super.super的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5102847/

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