例如,假设我想在呼叫super.viewDidLoad()
中跳过一个级别。所以我希望能够做到这样的事情:
override func viewDidLoad() {
super.super.viewDidLoad()
}
或
-(void)viewDidLoad {
[[super super] viewDidLoad];
}
此代码无法编译。这有可能通过其他解决方案吗?
答案 0 :(得分:1)
仅出于说明目的,以下代码按要求执行。它只在没有ARC编译时崩溃,这意味着它有一个错误。它没有错误检查。
除非您正在玩游戏并尝试学习,否则请勿使用此代码。
@import Foundation;
#import <objc/runtime.h>
#import <objc/message.h>
@interface M : NSObject
- (void)print;
@end
@implementation M
- (void)print { NSLog(@"M"); }
@end
@interface N : M
@end
@implementation N
- (void)print { NSLog(@"N"); }
@end
@interface O : N
@end
@implementation O
- (void)print {
Class mysupersuper = [[self superclass] superclass];
Method supersuperMethod = class_getInstanceMethod(mysupersuper, _cmd);
method_invoke(self, supersuperMethod);
}
@end
int main(int argc, char **argv)
{
O *o = O.new;
[o print];
return 0;
}
我使用命令编译它:clang -framework Foundation -fno-objc-arc -fmodules test.m
。
答案 1 :(得分:1)
这是你在Swift中可以做的。假设你有A和B类:
class A
{
func fun() { print("called fun() in A") }
}
class B : A
{
override func fun() { print("called fun() in B") }
}
你不能修改他们的定义,但是想在从B派生的C类中调用A中的fun()你可以这样做:
extension B
{
func funInA()
{
super.fun()
}
}
class C : B
{
override func fun() { funInA() }
}
我认为你可以使用类别在Objective-C中实现这样的功能。