如何调用super.super的方法?

Mar*_*aev 27 cocoa cocoa-touch objective-c ios

我想调用一个超类的超类方法,而不会破坏继承链.像这样的东西:

+(id) alloc 
{
    return [super.super alloc];
}
Run Code Online (Sandbox Code Playgroud)

有没有办法实现这个目标?

不要混淆这里superclass讨论的方法提供的行为.


UPD:

几句话supersuperclass差异.

让我们说,我们有AClassSuperAClass.从他们的名字AClass继承如下SuperAClass.他们每个人都有一个方法的实现-(void) foo;

AClass实现的一个下列类别方法:

超类:

+(id) alloc {
    return [[self superclass] alloc];
}
Run Code Online (Sandbox Code Playgroud)

超级:

+(id) alloc {
    return [super alloc];
}
Run Code Online (Sandbox Code Playgroud)

现在,假设这两行代码:

AClass *AClassInstance = [AClass alloc];
[AClassInstance foo];
Run Code Online (Sandbox Code Playgroud)

在第一种情况下(使用超类),SuperAClassfoo方法将被调用.用于(使用超)第二种情况下,AClassfoo方法将被调用.

小智 35

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

+ (id)someClassMethod {
    return [[[self superclass] superclass] someClassMethod];
}
Run Code Online (Sandbox Code Playgroud)

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

另一方面,实例方法中的事情变得更复杂.一种解决方案是获取指向超级(祖父)类中的方法实现的指针.例如:

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

与类方法示例类似,+superclass发送两次以获取超级类.IMP是一个指向方法的指针,我们获取方法的IMP,其名称与当前的one(-someInstaceMethod)相同,但指向supersuperclass中的实现,然后调用它.请注意,如果存在方法参数且返回值不同,则需要调整此值id.

  • "grannyImp"这个名字让我微笑. (3认同)