作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 ViewController 中有一个 UITabBar。选择标签栏项目我添加不同的 subview Controller 。并删除其他人。
但我从来没有在控制台上看到 deint 日志,只有 viewWillDisappear..
我怎样才能确保删除 subview Controller 以节省内存?
这就是我创建子 Controller 的方式:
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)
}
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
意思是“这个对象即将不复存在,因为不再有对它的保留引用”。
当您添加 subview Controller 和删除 subview Controller 时,您正在正确地进行父子“跳舞”。所以从这个角度来看一切都很好。当您调用 viewController.removeFromParentViewController
,确实有一个对它的保留引用消失了,即父子保留引用(childControllers
数组,它已删除并释放了子项)。
但这并不意味着所有保留引用都会消失。事实上,deinit
不称为存在其他保留引用的信号。你现在要做的就是找出那个引用是什么。但事实上,您似乎已经向我们展示了它是什么:
private lazy var lotteryViewController: LotteryViewController = {
let storyboard = UIStoryboard(name: "TrophyRoom", bundle: Bundle.main)
var viewController = storyboard.instantiateViewController(withIdentifier: "LotteryViewController") as! LotteryViewController
self.add(asChildViewController: viewController)
return viewController
}()
lotteryViewController
是对 subview Controller 的强(保留)引用。因此,即使在您将其作为 child 移除后,它仍使该 View Controller 保持事件状态。
lazy var
实例属性的好奇使用)。制作 subview Controller 的方法是实例化 View Controller ,将其作为其子级交给父级,然后放开 View Controller ,使对它的唯一引用是父级。 (如果您需要对子项的后续引用,您始终可以通过父项获得它。)您没有这样做,因此您不会获得
deinit
当 child 从 parent 身边移除时。
关于iOS 快速 : Deint a child ViewController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50533591/
我是一名优秀的程序员,十分优秀!