如何调用super.super的方法?
我想调用一个超类的超类的方法,而不打破inheritance链。 像这样的东西:
+(id) alloc { return [super.super alloc]; }
有没有办法做到这一点?
不要混淆superclass
方法提供的行为, 这里讨论。
UPD:
关于super
和super
差异的几句话。
可以说,我们有AClass
和SuperAClass
。 如下从他们的名字AClass
inheritanceSuperAClass
。 他们每个人都有一个方法的实现-(void) foo;
AClass
实现以下类方法之一:
超类:
+(id) alloc { return [[self superclass] alloc]; }
2.超级:
+(id) alloc { return [super alloc]; }
现在,假设这两行代码:
AClass *AClassInstance = [AClass alloc]; [AClassInstance foo];
在第一种情况下(使用超类), SuperAClass
的foo
方法将被调用。 对于第二种情况(使用super),将调用AClass
的foo
方法。
在你的特定例子中, +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
被发送两次以获得+superclass
。 IMP
是一个指向方法的指针,我们获得了一个名为与当前方法( -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);