【发布时间】:2018-11-05 02:42:02
【问题描述】:
我在 ViewController 中有一个 UITabBar。选择标签栏项目我添加不同的子视图控制器。并删除其他人。
但我从未在控制台上看到 deint 日志,只有 viewWillDisappear..
如何确定子视图控制器的定义以节省内存?
这就是我创建子控制器的方式:
private lazy var lotteryViewController: LotteryViewController = {
// Load Storyboard
let storyboard = UIStoryboard(name: "TrophyRoom", bundle: Bundle.main)
// Instantiate View Controller
var viewController = storyboard.instantiateViewController(withIdentifier: "LotteryViewController") as! LotteryViewController
// Add View Controller as Child View Controller
self.add(asChildViewController: viewController)
return viewController
}()
添加子控制器:
private func add(asChildViewController viewController: UIViewController) {
// Add Child View Controller
addChildViewController(viewController)
// Add Child View as Subview
containerView.addSubview(viewController.view)
// Configure Child View
viewController.view.frame = containerView.bounds
viewController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
// Notify Child View Controller
viewController.didMove(toParentViewController: self)
}
从父viewController调用的remove方法:
private func remove(asChildViewController viewController: UIViewController) {
// Notify Child View Controller
viewController.willMove(toParentViewController: nil)
// Remove Child View From Superview
viewController.view.removeFromSuperview()
// Notify Child View Controller
viewController.removeFromParentViewController()
}
子控制器的日志方法:
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print("Sessions View Controller Will Appear")
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
print("Sessions View Controller Will Disappear")
}
deinit {
NotificationCenter.default.removeObserver(self)
// Log if a view controller is being deinited
print("\nDeinit: \(self.description)\n")
}
【问题讨论】:
-
你为什么期待 deinit 的日志?您是否实现了自己的 deinit 方法并在那里记录了一些内容?
-
是的,当然,我有带打印功能的 deint 方法
-
使用 Instruments 找出视图控制器是否泄漏以及是什么保留了它。
-
如何创建视图控制器并将其添加到父视图?确保没有引用视图控制器的变量。
-
那么
lotteryViewController不是我们所说的保留引用吗?
标签: ios swift memory-management uiviewcontroller