2012-02-10 37 views
3

我在Objective-C的新手,不明白为什么我们需要使用[超级的dealloc][超级viewDidLoad中][超级viewWillAppear中:动画]。当我创建的代码示例应用程序,我看到这样的事情:为什么我需要在iOs中使用[super%methodname%]?

- (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开发”。并且没有找到任何有关此方法的参考:(例如,

+0

看到[这个问题](http://stackoverflow.com/questions/3095360/what-exactly-is-super-in-objective-c) – Nerdtron 2012-02-10 20:00:30

回答

9

的一点是,你是在继承他们,你的情况创建子类,这似乎是一个自定义视图控制器,例如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],超级重要的方法永远不会被调用,因为你有覆盖它在你的自定义实现中。所以,当你做包含在Foo的DoSomething的一个

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

的完全重要的代码不会被编译器视为您提供您的类中的方法自己,所以只有酒吧的版本将被调用。

所以每当你覆盖的方法,你必须确保该基类的版本被称为如果它必须被调用,这对于dealloc方法,因为这将释放基类可能在已经获得的任何记忆尤为重要初始化。

3

例如,调用[super dealloc]会告诉超类解除分配它分配的任何实例变量。在子类中,您将分配子类分配的实例方法,但是那么超级类需要做同样的事情,所以你必须明确地调用它,类似的,除了你提供的功能之外,你可能需要它提供的底层功能(尽管在某些情况下,你)这只是一种告诉编译器的方法,你想让超级类别除了你的类正在做什么之外还做它通常做的事情

4

在大多数情况下,当你重写父类中的方法,例如UIViewController,你仍然想要发生的默认行为以及您指定的自定义行为。 [超级方法名]是你如何告诉应用程序你想要包含父级的实现。

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

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

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
} 
相关问题