【问题标题】:Not calling [super viewDidLoad] and [super dealloc] from a subclass不从子类调用 [super viewDidLoad] 和 [super dealloc]
【发布时间】:2012-08-08 16:05:34
【问题描述】:

我有这 3 个课程:

@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 导致奇怪的行为。

目前,如果我在 SecondaryWebViewController 中注释掉 [super viewDidLoad] 和 [super dealloc] 以使 BaseViewController 永远不会被释放,那么一切运行正常。但是,我不知道这是否是正确的做事方式。

这种场景在子类中调用超函数的方法是什么?

【问题讨论】:

    标签: iphone objective-c subclass superclass


    【解决方案1】:

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

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

    这两个实例是完全独立的。

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

    我可能完全误解了,在这种情况下,请原谅。如果我没看错的话,你应该查一下类和对象的概念,这真的是继续深入的重要基础。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-12
      • 1970-01-01
      • 2011-10-18
      • 2011-11-17
      • 1970-01-01
      • 2011-04-01
      • 1970-01-01
      • 2023-04-07
      相关资源
      最近更新 更多