我已经阅读了使用 Objective-c 编程的苹果“消息传递”一章,并有几个关于 self 和 super 的问题。AFAIK 当编译器找到任何消息时,它会将其转换为带有两个隐藏参数的 objc_msgSend - 接收器、选择器和选择器的变量参数。例如[self test]
将是这样的:
objc_msgSend(self, @selector(test));
如果接收者的调度表中没有方法实现,那么函数将尝试在超类中找到实现。super 只是编译器开始在当前对象的超类中搜索方法实现的标志,并且在文档中苹果表示,当编译器找到“super”时,它会将其转换为类似的内容:
struct objc_super mySuperClass = {
self,
[self superclass]
};
objc_msgSendSuper(&mySuperClass, @selector(forwardedMethod));
我制作了一个包含 3 个类的项目,每个类都继承自另一个类。
@interface FirstClass : NSObject
- (void)forwardMethod;
@end
@interface SecondClass : FirstClass
@end
@interface ThirdClass : SecondClass
@end
我在我的根视图控制器中创建了第三类的实例并调用了他的名为“forwardMethod”的方法。实施:
//First Class
- (void)forwardMethod {
NSLog(@"Base class reached");
}
//SecondClass imp
- (void)forwardMethod {
NSLog(@"second class");
[super forwardMethod];
}
//ThirdClass imp
- (void)forwardMethod {
NSLog(@"third class");
[super forwardMethod];
}
一切正常。但后来我决定解释编译器:
//First Class
- (void)forwardMethod {
NSLog(@"Base class reached");
}
//SecondClass imp
- (void)forwardMethod {
NSLog(@"second class");
struct objc_super mySuperClass = {
self,
[self superclass]
};
objc_msgSendSuper(&mySuperClass, @selector(forwardMethod));
}
//ThirdClass imp
- (void)forwardMethod {
NSLog(@"third class");
struct objc_super mySuperClass = {
self,
[self superclass]
};
objc_msgSendSuper(&mySuperClass, @selector(forwardMethod));
}
这导致对第二个类“forwardMethod”的递归调用。我使用 self 和 [self superclass] 在二等舱的“forwardMethod”中创建了一个结构,但 self 是三等舱,
我的超类将始终是“二等舱”。也许我做错了什么,但我怎样才能到达基类“转发方法”?