为什么我需要在iOs中使用?

我是Objective-C的新手,不明白为什么我们需要使用[super dealloc][super viewDidLoad][super viewWillAppear:animated] 。 当我创build示例代码应用程序,我看到这样的事情:

- (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]; } 

PS现在我学习“开始iPhone 4开发”。 并没有find任何有关此方法的参考:(

重点是,你通过inheritance它们来创build子类,在你的情况下,这似乎是一个自定义的ViewController,例如从UIViewControllerinheritance数据和方法的MyViewController。 inheritance意味着,即使没有指定它们,你的类也将拥有父类所有的方法。 例如:

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

那么以下是有效的

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

即使你没有声明该方法,也可以在超类中find,因此调用超类方法。

现在假设你有以下几点:

 @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方法是非常重要的,因为这会释放基类在初始化时可能获得的内存。

在大多数情况下,当您重写父类中的某个方法(例如UIViewController)时,您仍然希望发生默认行为以及您指定的自定义行为。 [超级方法名称]是你如何告诉应用程序你想包括家长的实施。

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

例如,包括这个没有用处,可以从你的代码中删除:

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

例如,对[super dealloc]的调用告诉超类释放它分配的任何实例variables。 在你的子类中,你可以取消分配子类的实例方法,但是超类需要做同样的事情,所以你必须明确地调用它。 同样,使用其他方法,除了所提供的function之外,您可能还需要其提供的基础function。 (尽pipe在某些情况下,你可能不会。)这只是一种告诉编译器的方法,除了你的类正在做什么之外,你还想让超类去做它通常做的事情。