【问题标题】:deinit not called on child viewcontroller未在子视图控制器上调用 deinit
【发布时间】:2016-07-05 11:00:06
【问题描述】:

我有一个父 viewController,它在 childVC 中插入一个带有类方法的 childVC。这很好用。

class func insertIntoController(parentController: UIViewController, parentView: UIView) -> VideoDoorbellLiveView? {
    guard let liveViewController = parentController.storyboard?.instantiateViewControllerWithIdentifier(liveViewIdentifier) as? VideoDoorbellLiveView else { return nil }

    liveViewController.view.translatesAutoresizingMaskIntoConstraints = false
    parentController.addChildViewController(liveViewController)
    parentView.addSubview(liveViewController.view)

    let views = ["view": liveViewController.view]
    var constraints = NSLayoutConstraint.constraintsWithVisualFormat("H:|-0-[view]-0-|", options: NSLayoutFormatOptions.DirectionLeadingToTrailing, metrics: nil, views: views)
    constraints.appendContentsOf(NSLayoutConstraint.constraintsWithVisualFormat("V:|-0-[view]-0-|", options: NSLayoutFormatOptions.DirectionLeadingToTrailing, metrics: nil, views: views))
    parentView.addConstraints(constraints)

    liveViewController.didMoveToParentViewController(parentController)

    return liveViewController
}

父级确保控制器存在并设置几个字符串变量等。效果很好。

    guard let controller = VideoDoorbellLiveView.insertIntoController(self, parentView: liveView) else { return }
    liveViewController = controller // liveViewController is an optional instance variable

我的问题是当 parentVC 消失时(调用 deinit ),子 VC deinit 调用。

任何想法为什么? childVC中没有parentVC的引用。

我什至尝试在 parentVC 中执行此操作,但没有保证成功:

deinit {
    if let liveViewController = liveViewController {
        liveViewController.removeFromParentViewController()
    }
}

【问题讨论】:

  • 子 VC 中可能有一个保留周期
  • 这是我的第一个想法。检查每个关闭,我们每次都在做一个[弱自我]。不知道还要寻找什么:(
  • 使用仪器。如果有泄漏,它会查明它。
  • 我也有点担心你的liveViewController = controller。您不应该保留对子视图控制器的第二个持久引用。您已经有一个(在childViewControllers 数组中),这是您访问孩子的唯一方法。至少,让这个引用变弱,但最好不要有它。
  • @matt 最近的引用是为了解决子 VC 不会消失的问题。另外,由于 parentVC 正在调用它的 deinit,那么我应该能够假设它的实例变量也消失了。

标签: ios swift uiviewcontroller


【解决方案1】:

对我来说,我有一个保留周期,需要将弱 self 传递给父视图控制器中的 firebase 观察者,然后在两者上调用 deinit:

    func observeFeatureChanged(){
    microbeRef.queryOrdered(byChild: Nodes.TIMESTAMP)
        .observe(.childChanged) { [weak self] (dataSnapshot) in
            if let featureDic = dataSnapshot.value as? [String: Any]{
                let featureName = dataSnapshot.key
                if let index = self?.featureNames.firstIndex(of: featureName){
                    self?.featureNames[index] = featureName
                    self?.featureDictionaries[index] = featureDic
                    let indexpath = IndexPath(item: index, section: 0)
                    self?.tableView.reloadRows(at: [indexpath], with: .automatic)
                }
            }
    }
}

【讨论】:

    猜你喜欢
    • 2017-10-06
    • 2016-03-22
    • 1970-01-01
    • 2018-05-24
    • 2019-08-08
    • 2018-08-23
    • 2017-01-18
    • 2021-02-25
    • 1970-01-01
    相关资源
    最近更新 更多