为什么我需要在iOs中使用[super%methodname%]?
我在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开发”。并且没有找到任何有关此方法的参考:(例如,
的一点是,你是在继承他们,你的情况创建子类,这似乎是一个自定义视图控制器,例如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
方法,因为这将释放基类可能在已经获得的任何记忆尤为重要初始化。
例如,调用[super dealloc]
会告诉超类解除分配它分配的任何实例变量。在子类中,您将分配子类分配的实例方法,但是那么超级类需要做同样的事情,所以你必须明确地调用它,类似的,除了你提供的功能之外,你可能需要它提供的底层功能(尽管在某些情况下,你)这只是一种告诉编译器的方法,你想让超级类别除了你的类正在做什么之外还做它通常做的事情
在大多数情况下,当你重写父类中的方法,例如UIViewController,你仍然想要发生的默认行为以及您指定的自定义行为。 [超级方法名]是你如何告诉应用程序你想要包含父级的实现。
如果方法中唯一的一行是super的调用,那么可以从类中省略整个方法,因为所需的只是父级定义的默认行为。
例如,包括这也是没有用处的,可以从你的代码中删除:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
}
看到[这个问题](http://stackoverflow.com/questions/3095360/what-exactly-is-super-in-objective-c) – Nerdtron 2012-02-10 20:00:30