不从子类调用[super viewDidLoad]和[super dealloc]

时间:2012-08-11 19:52:18

标签: iphone objective-c subclass superclass

我有这三个班级:

@interface BaseViewController : UIViewController
@interface BaseWebViewController : BaseViewController
@interface SecondaryWebViewController : BaseViewController

在AppDelegate中,我将rootViewController设置为BaseWebViewController,它永远不会在应用程序的整个生命周期内取消分配。在BaseWebViewController中,我在各自的方法中调用[super viewDidLoad]和[super dealloc]。

在大多数应用程序中,用户将浏览BaseWebViewController上的UIWebView。但是在某些链接上,我需要推送(后来,弹出)SecondaryWebViewController。

我的问题是,由于BaseWebViewController和SecondaryWebViewController都是BaseViewController的子类,我不知道如何在SecondaryWebViewController中调用[super viewDidLoad]和[super dealloc]。

在SecondaryWebViewController中,我一直在调用那些[super viewDidLoad]和[super dealloc],但是我注意到它在调用[super dealloc]时引起了一些问题,尤其是随机崩溃。由于BaseWebViewController必须始终存在于应用程序的整个生命周期中,因此我不希望在BaseViewController上调用dealloc。

很抱歉,如果这听起来很混乱,但基本上,流程看起来像这样:

  1. AppDelegate将rootViewController设置为BaseWebViewController
  2. BaseWebViewController的viewDidLoad也调用超类BaseViewController viewDidLoad中
  3. 应用程序的大部分生命周期都花在了 BaseWebViewController,但偶尔使用SecondaryWebViewController 需要推动
  4. SecondaryWebViewController的viewDidLoad和dealloc调用超类的viewDidLoad和dealloc导致奇怪的行为。
  5. 目前,如果我在SecondaryWebViewController中注释掉[super viewDidLoad]和[super dealloc],以便从不释放BaseViewController,那么一切运行正常。但是,我不知道这是否是正确的做事方式。

    在诸如此场景的子类中调用超级函数的方法是什么?

1 个答案:

答案 0 :(得分:2)

如果我理解正确的话,你就是在混合类和对象的概念。

根据您的描述,您的应用中有两个视图控制器对象。其中一个是BaseWebViewController类的实例,另一个是SecondaryWebViewController类的实例

这两个实例彼此完全分开。

SecondaryWebViewController实例调用dealloc时,当它调用[super dealloc]时,这只会调用BaseWebViewController类的dealloc方法 - < strong>在同一个实例上。另一个视图控制器实例完全不受影响。

我可能完全被误解了,在那种情况下请原谅我。如果我理解正确,你应该查找类和对象的概念,这是继续深入的重要基础。