繁体   English   中英

自我与超级之间的区别

[英]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);
}

selfsuper实际上都指向同一个对象。 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM