我想在不破坏继承链的情况下调用超类的方法。就像这样:
+(id) alloc
{
return [super.super alloc];
}有办法做到这一点吗?
不要混淆行为提供的superclass方法,讨论了here。
UPD:
简单介绍一下super和superclass的区别。
比方说,我们有AClass和SuperAClass。如下所示,AClass继承了SuperAClass。它们每个都有一个方法-(void) foo;的实现。
AClass实现了--之一--以下类方法:
1.超类:
+(id) alloc {
return [[self superclass] alloc];
}2.超级:
+(id) alloc {
return [super alloc];
}现在,假设这2行代码:
AClass *AClassInstance = [AClass alloc];
[AClassInstance foo];在第一种情况下(使用超类),将调用SuperAClass的foo方法;对于第二种情况(使用超级类),将调用AClass的foo方法。
发布于 2011-02-24 10:20:53
在您的特定示例中,+superclass实际上是要做的事情:
+ (id)someClassMethod {
return [[[self superclass] superclass] someClassMethod];
}因为它是一个类方法,因此self引用了定义+someClassMethod的类对象。
另一方面,在实例方法上,事情变得有点复杂。一种解决方案是在超级(祖父母)类中获得一个指向方法实现的指针。例如:
- (id)someInstanceMethod {
Class granny = [[self superclass] superclass];
IMP grannyImp = class_getMethodImplementation(granny, _cmd);
return grannyImp(self, _cmd);
}类似于类方法示例,+superclass被发送两次以获得超类。IMP是指向方法的指针,我们获得一个指向名称与当前方法(-someInstaceMethod)相同但指向超类中的实现的方法的IMP,然后调用它。请注意,如果存在与id不同的方法参数和返回值,则需要对其进行调整。
发布于 2014-10-01 21:32:30
感谢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);https://stackoverflow.com/questions/5102847
复制相似问题