[super ... any method name]
的最佳用途是什么?最近我发现在dealloc中[super dealloc]
必须站在同一个目的。因为如果我们在[super dealloc]
之后设置它,那么以前没有使用过的任何变量都可以被垃圾填充。这是一件罕见的事情,但它是可能的。在此之后,我们的应用程序将崩溃。
那么使用超级方法的最佳方法是什么,例如最适合用于-(void)viewWillAppear:(BOOL)animated
的方法。 [super viewWillAppear:(BOOL)animated]
在身体开始或最终的最佳位置在哪里?
答案 0 :(得分:55)
通常的经验法则是当你重写一个进行某种初始化的方法时,先调用super然后再做你的东西。当你覆盖某种拆解方法时,你会打电话给最后一个:
- (void) setupSomething {
[super setupSomething];
…
}
- (void) tearDownSomething {
…
[super tearDownSomething];
}
第一种是init…
,viewWillAppear
,viewDidLoad
或setUp
等方法。第二种是dealloc
,viewDidUnload
,viewWillDisappear
或tearDown
。这不是一个硬性规则,它只是从方法所做的事情开始。
答案 1 :(得分:17)
只需查看相应的文档即可。例如,何时在UIViewController的重写方法中调用super:
didReceiveMemoryWarning :你可以 覆盖此方法(根据需要) 释放使用的任何额外内存 你的视图控制器。如果你这样做,那就是 一定要调用超级实现 在某些时候允许观点 控制器释放其视图。 [表示顺序并不重要。]
loadView :您的自定义实施 这种方法不应该调用 super 。
setEditing:animated :此方法 应该调用超级的实现 在更新其视图之前。 [表示顺序很重要。]
viewWillAppear , viewDidAppear , viewWillDisappear , viewDidDisappear : 如果重写此方法,则必须 在你的某个时刻打电话给超级 实现。 [表示顺序并不重要。]
dealloc:如果您实施此方法 但正在构建您的应用程序 iOS 2.x,你的dealloc方法应该 释放每个对象,但也应该 设置对该对象的引用 在致电超级之前没有。 [表示顺序很重要。]
您是否意识到viewDidLoad中的super类似规则并且未提及viewDidUnload方法?因为你不需要在这些中调用super。
答案 2 :(得分:3)
这主要取决于你的子类是否需要在超类方法之前或之后发生。或两者,视情况而定。
这就是为什么init方法首先调用super方法,dealloc方法最后的事情。在您的示例中,当您收到通知将出现视图时,您可能希望让超级做它的事情,然后,在那之后,处理您的子类视图需要做的任何事情。但它可以想象其他方式,或者您可以在代码之间调用super方法。根据您的应用需求,将适用不同的规则。