[英]Difference between self and super
刚刚有一个菜鸟问题。 我试图了解调用self和super之间的区别。 现在,我了解了继承和其他基本的OOP概念,但是对我而言,自我和超级的概念仍然不清楚。 我将通过一个例子来说明我的问题。
因此,当手机上下颠倒倾斜时,以下代码将执行锁定。 我知道“ Scene2ViewController”是“ UIViewController”的子类,因此“ Scene2ViewController”继承了UIViewController的所有方法。 因此,下面我以消息的接收者为self的方式调用performPergueWithIdentifier方法。 现在,当我将“自我”更改为“超级”时,代码仍以相同的方式执行。 叫super和叫self不一样吗? 如果有人可以向我解释这一点,将不胜感激。
//Scene2ViewController.m
- (BOOL)shouldAutorotateToInterfaceOrientation: (UIInterfaceOrientation)interfaceOrientation
{
if (interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) {
[self performSegueWithIdentifier:@"SegueToScene1" sender:self];
}
return (interfaceOrientation ==
UIInterfaceOrientationPortrait);
}
self
和super
实际上都指向同一个对象。 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
特别方便。 因此,我们可以让B的foo
实现通过[super foo]
调用A的版本。 如果没有super
,就无法调用继承的方法,而从被覆盖的方法中调用foo
将导致无限递归。
当您调用self
方法(或者用Objective-C术语向self
发送消息)时,运行时将在继承层次结构中搜索该方法的实现,从self
开始,直至NSObject
。 因此,如果self
实现该方法,它将被执行。 如果没有,将检查super
类,依此类推。
发送消息到super
非常相似,除了运行时将开始在super
寻找实现并跳过self
。
有时候,在子类中,您可能会覆盖父类中已经定义的函数。 通常,这在init函数中发生。 因此,如果您需要调用父类的init函数,则可以调用super。 如果您需要子类的功能,则可以调用self。 如果只有父对象声明了该函数,则Self和super的行为相同。 但是,如果只有子类具有声明,那么您将无法从super调用函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.