【发布时间】: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