在两个嵌套的子类中调用super.viewDidLoad()时,我正在使用Swift进行无限循环

时间:2014-11-14 21:32:09

标签: ios swift crash subclass

我正在使用Swift编写的iOS应用程序。我有一个UITabBarController的子类,然后是一个嵌套的子类:

class HWTabBarController: UITabBarController {
    override func viewDidLoad() {
        super.viewDidLoad()
        ...
    }
}

class MainTabBarController: HWTabBarController {
    override func viewDidLoad() {
        super.viewDidLoad()
        ...
    }
}

这在iOS模拟器中运行良好,即使我在iPhone上调试应用程序也是如此。 但是当我将应用程序存档并使用TestFlight将其发送到我的手机时崩溃了。

我的崩溃日志充满了这个无限循环:

22  HDWR                           0x00145e10 @objc HDWR.MainTabBarController.viewDidLoad (HDWR.MainTabBarController)() -> () (MainTabBarController.swift:16)
23  HDWR                           0x00262867 NRMA__voidParamHandler
24  HDWR                           0x0014ea00 HDWR.HWTabBarController.viewDidLoad (HDWR.HWTabBarController)() -> () (HWTabBarController.swift:24)
25  HDWR                           0x00145e10 @objc HDWR.MainTabBarController.viewDidLoad (HDWR.MainTabBarController)() -> () (MainTabBarController.swift:16)
26  HDWR                           0x00262867 NRMA__voidParamHandler
27  HDWR                           0x0014ea00 HDWR.HWTabBarController.viewDidLoad (HDWR.HWTabBarController)() -> () (HWTabBarController.swift:24)
28  HDWR                           0x00145e10 @objc HDWR.MainTabBarController.viewDidLoad (HDWR.MainTabBarController)() -> () (MainTabBarController.swift:16)
29  HDWR                           0x00262867 NRMA__voidParamHandler
30  HDWR                           0x0014ea00 HDWR.HWTabBarController.viewDidLoad (HDWR.HWTabBarController)() -> () (HWTabBarController.swift:24)
31  HDWR                           0x00145e10 @objc HDWR.MainTabBarController.viewDidLoad (HDWR.MainTabBarController)() -> () (MainTabBarController.swift:16)
32  HDWR                           0x00262867 NRMA__voidParamHandler
33  HDWR                           0x0014ea00 HDWR.HWTabBarController.viewDidLoad (HDWR.HWTabBarController)() -> () (HWTabBarController.swift:24)

voidParamHandler指令的内容是什么,为什么会导致MainTabBarController.viewDidLoad

我在这里做错了吗?或者这是Swift中的错误?

3 个答案:

答案 0 :(得分:5)

您是否在自己的应用中使用了New Relic? (我猜你所有那些NRMA__voidParamHandler引用。)我有这个确切的问题。我禁用了New Relic SDK,从Testflight下载的版本停止了崩溃。我还没有报告过一个bug,但你/我/我们可能应该这样做。

答案 1 :(得分:5)

随着swift的加入,所有甜蜜的动态功能查找Objective-c已经完成了。要恢复该功能,您需要添加"动态"声明标志为New Relic仪器的所有方法。

像这样:

class HWTabBarController: UITabBarController {
    override dynamic func viewDidLoad() {
        super.viewDidLoad()
        ...
    }
}

class MainTabBarController: HWTabBarController {
    override dynamic func viewDidLoad() {
        super.viewDidLoad()
        ...
    }
}

更多详细信息,包括此处包含的功能,在此处:https://docs.newrelic.com/docs/mobile-monitoring/new-relic-mobile/getting-started/enabling-swift-interaction-traces

答案 2 :(得分:0)

我刚下载了回购邮件,在我自己的个人资料上签名,所有内容似乎都可以正常运行。没有无限循环,没有崩溃。这也是通过Test Flight进行的。这让我相信你的系统某处有一些错误。我建议做一些事情......

  1. 清理构建cmd + alt + shift + k&&删除手机上的应用。
  2. 关闭Xcode然后删除您的派生数据。 (如果你还没有这样做,我可以扩展如何做到这一点。)
  3. 如果可行,请将其注册为试飞的新应用。
  4. 我的想法是,当你删除你的派生数据时它会有所帮助,但我会这样做只是为了让你知道一切都很干净。同样,我在任何阶段都没遇到过这个问题:模拟器,从Xcode直接安装或通过Test Flight下载。

    还要确保捆绑ID已正确注册,并且在Test Flight上一切都是服务器端。我无法想象为什么它会导致循环,但这是一个奇怪的情况所以让我们看看会发生什么。 :^)