为什么我需要在iOs中使用[super%methodname%]?

时间:2012-02-10 19:57:27

标签: objective-c ios xcode

我是Objective-C的新手,并且不明白为什么我们需要使用 [super dealloc] [super viewDidLoad] [ super viewWillAppear:animated] 。当我创建示例代码应用程序时,我看到类似这样的内容:

- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
}

- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
}

 - (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
}

实际上,Xcode 4总是在每个自动生成的末尾添加超级方法  方法。为什么呢?

或者当我使用dealloc方法。为什么我需要在最后添加[super dealloc]?

- (void)dealloc
{
 [nameField release];
 [numberField release];
 [sliderLabel release];
 [super dealloc];
}

P.S。现在我研究“开始iPhone 4开发”。并且没有找到关于这种方法的任何参考:(

3 个答案:

答案 0 :(得分:10)

关键是,您通过继承它们来创建子类,在您的情况下,这似乎是一个自定义的ViewController,例如MyViewController从UIViewController继承数据和方法。继承意味着,即使您没有指定它们,您的类也将具有父类具有的所有方法。例如:

@interface Foo : NSObject
- (void) doSomething;
@end

@interface Bar : Foo
@end

然后以下是有效的

Bar *myBar = [[Bar alloc] init];
[myBar doSomething];

即使您没有声明该方法,也可以在超类中找到它,因此会调用超类方法。

现在假设你有以下内容:

@interface Bar : Foo
-(void) doSomething;
@end

两者的实施都是

@implementation Foo
- (void) doSomething
{
  NSLog(@"This is a super important method that HAS TO BE CALLED IN ANY CASE");
}
@end

@implementation Bar
-(void) doSomething
{
 NSLog(@"Well this is important, but not as important as Foos implementation");
}
@end

如果没有[super doSomething],则永远不会调用超级重要的方法,因为您在自定义实现中已经重写它。所以当你做一个

Bar *myBar = [[Bar alloc] init];
[myBar doSomething];

编译器不会看到Foo的doSomething中包含的完全重要的代码,因为您自己在类中提供了该方法,因此只会调用Bar的版本。

因此,无论何时覆盖方法,都必须确保在必须调用基类版本时调用它,这对于dealloc方法尤为重要,因为这将释放基类可能的任何内存在初始化期间获得了。

答案 1 :(得分:4)

在大多数情况下,当您覆盖父类中的方法时,例如UIViewController,您仍然希望发生默认行为以及您指定的自定义行为。 [super method-name]是你告诉应用程序你想要包含父实现的方法。

如果方法中唯一的一行是对super的调用,则可以省略类中的整个方法,因为您只需要父级定义的默认行为。

例如,包括此内容没有任何意义,可以从您的代码中删除:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
}

答案 2 :(得分:3)

例如,对[super dealloc]的调用告诉超类释放它分配的任何实例变量。在您的子类中,您释放子类分配的实例方法,但是超类需要执行相同的操作,因此您必须显式调用它。同样,使用其他方法,除了提供的功能外,您可能还需要它们提供的基础功能。 (虽然在某些情况下,你可能没有。)这只是告诉编译器你希望超类除了你的类正在做的事情之外还要做它通常做的事情的方法。

相关问题