如何调用super.super的方法?

我想调用一个超类的超类的方法,而不打破inheritance链。 像这样的东西:

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

有没有办法做到这一点?

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


UPD:

关于supersuper差异的几句话。

可以说,我们有AClassSuperAClass 。 如下从他们的名字AClassinheritanceSuperAClass 。 他们每个人都有一个方法的实现-(void) foo;

AClass实现以下类方法之一:

超类:

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

2.超级:

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

现在,假设这两行代码:

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

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

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

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

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

另一方面,在实例方法中事情会变得更加复杂。 一个解决scheme是获取超级(祖父)类中的方法实现的指针。 例如:

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

与类方法的例子类似, +superclass被发送两次以获得+superclassIMP是一个指向方法的指针,我们获得了一个名为与当前方法( -someInstaceMethod )相同的方法的IMP,但指向超类中的实现,然后调用它。 请注意,如果有方法参数和返回值不同于id ,则需要对此进行调整。

感谢Bavarious ,他鼓励我让一些运行时间员工参与其中。

简而言之,所需的假设线:

 return [super.super alloc]; 

可以在这个“真实的”中转化:

 return method_getImplementation(class_getClassMethod([[self superclass] superclass], _cmd))([self class], _cmd); 

为了使其更加清晰,可以扩展如下:

 Method grannyMethod = class_getClassMethod([[self superclass] superclass], _cmd); IMP grannyImp = method_getImplementation(grannyMethod); return grannyImp([self class], _cmd);