关于C#:编译器找到[super msg]时会做什么?

what does the compiler when it finds [super msg];

我读过苹果公司的"信息"一章,内容是关于Objective-C的编程,还有几个关于Self和Super的问题。当编译器发现任何消息时,它会用两个隐藏参数(接收器、选择器和选择器的变量参数)将其转换为objc_msgsend。例如,[self test]就是这样的:

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></

在运行时selfis the value of a reference to the current对象,你可以使用selfto find the class of the object is an example self-在你的ThirdClassof type的对象。P></

现在selfthe value of are called as方法不改变,即使我知道你是在FirstClassexample is the value of selfS forwardMethod参考对象ThirdClassto an of type。我知道你selfenables to find the type of the对象,但它不会告诉你在哪里你是在当前执行的方法在其模式的继承链,它知道本身不能告诉你什么是that the next类链。P></

我考虑的编译时间。当compiling SecondClass编译器知道的超级is the FirstClass,知道电话呼叫superis to a method(apart from a中买来FirstClassbelow)。我知道我可以使用selfthe编译器和运行时对象的确定[FirstClass class]to the method to which the在线呼叫类的编译时间和at which to start the search for the method(as any lookup method is starting at a search and the proceeding类在继承和执行链直到is found)。我知道你是在你的代码只是一个实例方法超时:P></

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 [SecondClass class])在性能和objc_msgSendSuper2to find the lookup method which will the first -在运行时继承链that is the SecondClassm后会whereas `objc_msgSendSuperstart the search at SecondClass本身。P></

我不快乐,但这在使用通用代码(除非你有一个非常,非常,非常……很好的理由;-))P></


在你的本构secondclass will be the same as with contents populated确切的说因为是你级:P></

1
2
3
4
   struct objc_super mySuperClass = {
      self,
      [self superclass]
   };

selfhas the same value in both and cases,[self superclass]thus,因为总是会secondclass when called from an instance of级(甚至when the actual实现——————resides secondclass队列中)。there is to the位更多的是在魔术的编译器(objc发射_那么msgsendsuper is that has to straightforward)/人参考,这样即使things to the class的类和/或ISA posing指针处理-程序员不坏,我仍然工作-作为预期。这些看起来还没有在很长一段长细节,知道确切的说因为是how that工厂。P></

the source to the is available and the编译运行。P></