what does the compiler when it finds [super msg];
我读过苹果公司的"信息"一章,内容是关于Objective-C的编程,还有几个关于Self和Super的问题。当编译器发现任何消息时,它会用两个隐藏参数(接收器、选择器和选择器的变量参数)将其转换为objc_msgsend。例如,
1 | objc_msgSend(self, @selector(test)); |
如果接收器的调度表中没有方法实现,那么函数将尝试在超类中查找实现。super只是编译器开始在当前对象的超类中搜索方法实现的一个标志,在文档中,Apple说当编译器找到"super"时,它会将其翻译成如下形式:
1 2 3 4 5 | struct objc_super mySuperClass = { self, [self superclass] }; objc_msgSendSuper(&mySuperClass, @selector(forwardedMethod)); |
我已经创建了一个包含3个类的项目,每个类都继承自另一个类。
1 2 3 4 5 6 7 8 9 | @interface FirstClass : NSObject - (void)forwardMethod; @end @interface SecondClass : FirstClass @end @interface ThirdClass : SecondClass @end |
我在根视图控制器中创建了第三个类的实例,并调用了名为"ForwardMethod"的方法。实施情况:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | //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]; } |
一切正常。但后来我决定解释编译器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | //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和[自超类]在第二类的"forwardmethod"中创建了一个结构,但self是第三类,并且我的超类总是"二等"。也许我做错了什么,但是我如何才能得到基类"forward方法"?
注:教育用途的存储器(which is good!)在生产代码,不要使用!P></
你也有很多,只是一个班了。P></
get to see the递归考虑为什么你how the using the can be found超类的信息在编译时和运行在可用时间。P></
在运行时
现在
我考虑的编译时间。当compiling
1 2 3 4 5 6 7 8 9 10 11 12 13 | @implementation SecondClass - (void)forwardMethod { NSLog(@"second class"); struct objc_super mySuperClass = { self, [FirstClass class] }; objc_msgSendSuper(&mySuperClass, @selector(forwardMethod)); } |
如果你使用你的队列将工作。but…P></
但是,上述...that above。Objective-C allows to be at the继承链的运行时类蚀变调和使用,编译器知道the我在编译时总rely on the chain to the work out继承超类。我知道我可以使用它吗?好的,当compiling the method for a是开源的,它知道belongs method to the class,class,我知道它的编译码方法into the to find the which开始使用超级队列和the search for a class at the the next方法在运行时继承链。This is the事实什么编译器会给你换你的尾巴,一级房屋:调和usedP></
1 2 3 4 5 6 7 8 9 10 11 12 13 | @implementation SecondClass - (void)forwardMethod { NSLog(@"second class"); struct objc_super mySuperClass = { self, [SecondClass class] }; objc_msgSendSuper2(&mySuperClass, @selector(forwardMethod)); } |
编译器编译注释《passes变流级(the
我不快乐,但这在使用通用代码(除非你有一个非常,非常,非常……很好的理由;-))P></
在你的本构secondclass will be the same as with contents populated确切的说因为是你级:P></
1 2 3 4 | struct objc_super mySuperClass = { self, [self superclass] }; |
the source to the is available and the编译运行。P></