1

刚刚有一个菜鸟问题。我试图理解调用 self 和 super 之间的区别。现在我了解了继承和其他基本的 OOP 概念,但是我仍然不清楚 self 和 super 的概念。我将用一个例子来说明我的问题。

因此,当手机倒置时,下面的代码会执行 segue。我知道“Scene2ViewController”是“UIViewController”的子类,因此“Scene2ViewController”继承了 UIViewController 的所有方法。所以下面我调用了 performSegueWithIdentifier 方法,消息的接收者是 self。现在,当我将“self”更改为“super”时,代码仍然以相同的方式执行。调用 super 和调用 self 不一样吗?如果有人可以向我解释这一点,将不胜感激,谢谢。

//Scene2ViewController.m
- (BOOL)shouldAutorotateToInterfaceOrientation:  (UIInterfaceOrientation)interfaceOrientation
{
if (interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) {
    [self performSegueWithIdentifier:@"SegueToScene1" sender:self];
}

return (interfaceOrientation == 
        UIInterfaceOrientationPortrait);
}
4

3 回答 3

6

self实际上两者super都指向同一个对象。super是一个关键字,它告诉编译器生成开始在超类中而不是在当前类中搜索方法定义的指令。

@interface A : NSObject {}
- (void)foo;
@end

@implementation A
- (void)foo {
    NSLog(@"A's foo!");
}
@end

@interface B : A
@end

@implementation B
- (void)foo {
    NSLog(@"B's foo!");
}
@end

//...somewhere in a method of class B...
[self foo];    // prints "B's foo" in the console
[super foo];    // prints "A's foo" in the console

如果我们根据注释假设最后几行在 B 的某个方法中,则self指向 B 的某个实例。super也指向 B 的同一个实例。但是当您使用selfto callfoo时,搜索的实现foo从类 B 开始。使用super时,搜索foo从 B 的超类 A 开始。

super当您想要保留继承的行为但添加一些东西时特别方便。因此,我们可以使用 B 实现foo调用 A 的版本[super foo]。如果没有super,就无法调用继承的方法,并且foo从重写的方法调用将导致无限递归。

于 2012-06-02T18:05:06.040 回答
5

当你调用一个方法self(或者更确切地说是向 Objective-C 术语发送消息self)时,运行时将在继承层次结构中搜索该方法的实现,从 开始self,一直到NSObject. 因此,如果self实现了该方法,它将被执行。如果不是,super则将检查该类,依此类推。

将消息发送到非常相似,不同之处在于运行时将开始在和 skipsuper中寻找实现。superself

于 2012-06-02T18:07:09.510 回答
2

有时,在子类中,您可能会覆盖已在父类中定义的函数。这经常发生在 init 函数中。所以如果你需要调用父类的init函数你调用super。如果您需要子类的功能,您可以调用 self. 如果只有父级声明了函数,则 Self 和 super 行为相同。但是如果只有子类有声明,那么你不能从 super 调用函数。

于 2012-06-02T18:09:22.503 回答