我该什么时候打电话给超级

时间:2010-10-11 13:34:12

标签: objective-c oop inheritance

[super ... any method name]的最佳用途是什么?最近我发现在dealloc中[super dealloc]必须站在同一个目的。因为如果我们在[super dealloc]之后设置它,那么以前没有使用过的任何变量都可以被垃圾填充。这是一件罕见的事情,但它是可能的。在此之后,我们的应用程序将崩溃。

那么使用超级方法的最佳方法是什么,例如最适合用于-(void)viewWillAppear:(BOOL)animated的方法。 [super viewWillAppear:(BOOL)animated]在身体开始或最终的最佳位置在哪里?

3 个答案:

答案 0 :(得分:55)

通常的经验法则是当你重写一个进行某种初始化的方法时,先调用super然后再做你的东西。当你覆盖某种拆解方法时,你会打电话给最后一个:

- (void) setupSomething {
    [super setupSomething];
    …
}

- (void) tearDownSomething {
    …
    [super tearDownSomething];
}

第一种是init…viewWillAppearviewDidLoadsetUp等方法。第二种是deallocviewDidUnloadviewWillDisappeartearDown。这不是一个硬性规则,它只是从方法所做的事情开始。

答案 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方法。根据您的应用需求,将适用不同的规则。