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

Ale*_*sky 24 oop inheritance objective-c

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

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

zou*_*oul 57

通常的经验法则是,当你重写一个进行某种初始化的方法时,先调用super然后再做你的东西.当你覆盖某种拆解方法时,你会超级呼叫:

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

- (void) tearDownSomething {
    …
    [super tearDownSomething];
}
Run Code Online (Sandbox Code Playgroud)

第一种是类似的方法init…,viewWillAppear,viewDidLoadsetUp.第二类是喜欢的东西dealloc,viewDidUnload,viewWillDisappeartearDown.这不是硬性规则,它只是从方法所做的事情开始.

  • 它甚至不可能,如果你这样做,编译器会打你. (3认同)

Özg*_*gür 17

只需查看相应的文档即可.例如,何时在UIViewController的重写方法中调用super :

didReceiveMemoryWarning:您可以覆盖此方法(根据需要)以释放视图控制器使用的任何其他内存.如果这样做,请确保在某个时刻调用超级实现以允许视图控制器释放其视图.[意味着顺序并不重要.]

loadView:这个方法的自定义实现不应该调用super.

setEditing:animated:此方法应在更新其视图之前调用super的实现.[意味着秩序很重要.]

viewWillAppear,viewDidAppear, viewWillDisappear,viewDidDisappear:如果重写此方法,则必须在实现中的某个时刻调用super.[意味着顺序并不重要.]

dealloc:如果你实现了这个方法但是正在为iOS 2.x构建应用程序,你的dealloc方法应该释放每个对象,但是在调用super之前还应该将对象的引用设置为nil .[意味着秩序很重要.]

您是否在viewDidLoad中意识到类似的super规则并且未提及viewDidUnload方法?因为你不需要在这些中调用super.

  • 警告:在处理更深层次的层次结构时必须小心。如果 A 继承自 UIVIewController 并覆盖 viewDidLoad,而 B 继承自 A 并覆盖 viewDidLoad,则可能是在 B 的实现中发送 [super viewDidLoad] 是强制性的。正如 Comptrol 所说,A 的文档应该明确说明,实现 B 的开发人员应该阅读 A 的文档。 (2认同)