我已经从使用objective-c的编程中读到了苹果的"消息传递"章节,并得到了关于self和super的几个问题.AFAIK当编译器发现任何消息时,它将其转换为带有两个隐藏参数的objc_msgSend - 接收器,选择器和选择器的变量参数.例如[self test]将是这样的:
objc_msgSend(self, @selector(test));
Run Code Online (Sandbox Code Playgroud)
如果接收者的调度表中没有方法实现,那么函数将尝试在超类中查找实现.super只是编译器开始在当前对象的超类中搜索方法实现的标志,并且在文档中,apple说当编译器找到'super'时,它会将其转换为类似的东西:
struct objc_super mySuperClass = {
self,
[self superclass]
};
objc_msgSendSuper(&mySuperClass, @selector(forwardedMethod));
Run Code Online (Sandbox Code Playgroud)
我创建了一个包含3个类的项目,每个类都继承自另一个类.
@interface FirstClass : NSObject
- (void)forwardMethod;
@end
@interface SecondClass : FirstClass
@end
@interface ThirdClass : SecondClass
@end
Run Code Online (Sandbox Code Playgroud)
我在根视图控制器中创建了第三个类的实例,并调用了他的方法"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];
}
Run Code Online (Sandbox Code Playgroud)
一切正常.但后来我决定解释编译器:
//First Class
- (void)forwardMethod {
NSLog(@"Base class reached");
}
//SecondClass imp …Run Code Online (Sandbox Code Playgroud)