viewdidAppear:为什么我要打电话给超级?

时间:2015-02-07 16:01:20

标签: ios objective-c

从Apple的文档中,如果我覆盖该方法,我必须在某个时候调用super。我有两个ViewControllers与segue连接在一起。如果按第一个VC中的按钮,则转到第二个VC。问题是当我覆盖第一个VC的viewDidAppear,并调用第二个VC的superviewDidAppear时,这不是我想要的。我删除了super,一切都很好。

  • 为什么从第一个VC调用super.viewDidAppear会调用secondVC.viewDidAppear
  • 不是说viewDidAppear是个坏主意吗?

提前谢谢!

1 个答案:

答案 0 :(得分:7)

不调用[super viewDidAppear]确实是一个坏主意。 UIViewController的基类包含viewDidAppear中需要调用的代码或者无法正常运行的代码。我以前忘记打电话给[super viewDidAppear],事情不能正常工作。我忘记了什么是不好的效果,但它们是微妙的,并且很难调试。

第二个视图控制器对[super viewDidAppear]的调用正在调用第一个视图控制器是没有意义的。我认为你是误会。

我的猜测是你的第二个视图控制器是第一个视图控制器的子类。在第二个视图控制器中,当您调用[super viewDidAppear]时,它会调用父类的方法实现。由于您的第二个视图控制器的类与第一个视图控制器相同,因此将调用该父 CLASS的方法。但是,它未在第一个视图控制器实例上调用。子视图控制器有多个版本的viewDidAppear可以调用:它的.m文件中的自定义方法,写在它的父类的.m文件中的方法,以及在它的祖父级类中定义的方法的任何实现,很棒-grandparent class等。

隐喻:

想象一下狗的进化。首先,只有狗,没有狗品种。  狗可以摇尾巴,所以所有的狗都有“摇摆”的方法。

一只母狗有一只小狗是第一个指针。 (类Pointer。)它继承了它的父类的所有方法,包括wag,但也有一个方法“点”。

它在正常摇摆结束时也有点摆动,所以它有一个wag方法的自定义实现。这是标准wag方法的新结局,因此Pointer类首先调用父类的wag方法,然后是自定义方法。

在指针的“摇摆”方法的实现中,它调用[super wag]来做父 CLASS的摇摆,然后在最后添加它自己的摆动。

所以Pointer类的wag方法可能如下所示:

@implementation Pointer

- (void) wag;
{ 
  [super wag];
  [self tailWiggle];
}

@end

现在,如果你有母亲(班级狗的一个实例)和小狗(类指针的一个实例)站在一起,你的两个摇摆方法都有断点,这就是将要发生的事情。 / p>

当小狗摇尾时,它首先调用父** CLASS的* wag方法。 (它不会问它的母亲,Dog,摇尾巴,它使用父类定义的狗摇摆方法。)

由于Dog类和Pointer类的wag方法中都有断点,因此您将在Dog类的wag方法中看到断点。然而,仍然是小狗摇着它的尾巴。它只是做了第一次正常的狗式摇摆,然后在最后添加了Pointer特定的摆动。所以它是狗的小狗实例,做了Wag的Dog版本,其代码是在Dog类的实现中定义的。

你可能会误解断点/日志语句,并认为你看到母狗的摇摆方法被解雇了。然而,这不是正在发生的事情。

现在,回到你的问题。

假设视图控制器1的类型为ParentVC,而视图控制器2的类型为ChildVC,它继承自ParentVC:

@interface ChildVC: ParentVC
...
@end

View Controller 2的类型是ChildVC,它是视图控制器1的子类。当视图控制器2调用[super viewdidAppear]时,它在为ParentVC类定义的代码中调用它。这与在视图控制器1中调用该方法不同。

查看调试变量列表并记下视图控制器1和视图控制器2的内存地址。当您中断对viewDidAppear的调用时,请注意调用该方法的对象的内存地址。

当视图控制器2调用[super viewdidAppear]时,您将看到运行的ParentVC.m文件中定义的代码,但运行该代码的对象是视图控制器2.