Mar*_*aev 27 cocoa cocoa-touch objective-c ios
我想调用一个超类的超类方法,而不会破坏继承链.像这样的东西:
+(id) alloc
{
return [super.super alloc];
}
Run Code Online (Sandbox Code Playgroud)
有没有办法实现这个目标?
不要混淆这里superclass讨论的方法提供的行为.
UPD:
几句话super和superclass差异.
让我们说,我们有AClass和SuperAClass.从他们的名字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)
在第一种情况下(使用超类),SuperAClass的foo方法将被调用.用于(使用超)第二种情况下,AClass的foo方法将被调用.
小智 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.
| 归档时间: |
|
| 查看次数: |
11000 次 |
| 最近记录: |