刚刚有一个菜鸟问题。我试图理解调用自我和超级之间的区别。现在我理解了继承和其他基本的OOP概念,但自我和超级的想法对我来说仍然不清楚。我将以一个例子说明我的问题。
因此,当手机颠倒时,下面的代码执行一个segue。我知道“Scene2ViewController”是“UIViewController”的子类,因此“Scene2ViewController”继承了UIViewController的所有方法。所以下面我调用方法performSegueWithIdentifier,消息的接收者是self。现在,当我将“self”更改为“super”时,代码仍以相同的方式执行。是不是称自己超级呼唤自己?如果有人能向我解释这一点,将不胜感激,谢谢。
//Scene2ViewController.m
- (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)interfaceOrientation
{
if (interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) {
[self performSegueWithIdentifier:@"SegueToScene1" sender:self];
}
return (interfaceOrientation ==
UIInterfaceOrientationPortrait);
}
答案 0 :(得分: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实例。但是当您使用self
来呼叫foo
时,搜索foo
的实现从B类开始。当您使用super
时,搜索foo
}以B的超类A开始。
super
特别方便,但添加一些东西。因此,我们可以使用foo
让B实现[super foo]
调用A的版本。如果没有super
,则无法调用继承的方法,并且从重写的方法调用foo
将导致无限递归。
答案 1 :(得分:5)
当您调用self
的方法(或者更确切地说,以Objective-C术语向self
发送消息)时,运行时将在继承层次结构中搜索该方法的实现,从{开始{1}},上升到self
。因此,如果NSObject
实现了该方法,则会执行该方法。如果没有,将检查self
类,依此类推。
将消息发送到super
非常相似,但运行时将开始在super
中查找实现并跳过super
。
答案 2 :(得分:2)
有时,在子类中,您可能会覆盖已在父类中定义的函数。这通常发生在init函数中。因此,如果您需要调用父类的init函数,则调用super。如果你需要子类的功能,你可以调用self。如果只有父项具有声明的函数,则Self和super的行为相同。但是如果只有子类具有声明,那么你就不能从super调用该函数。