gpt4 book ai didi

iOS 快速 : Deint a child ViewController

转载 作者:行者123 更新时间:2023-12-01 18:37:24 25 4
gpt4 key购买 nike

我在 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
}()

添加子 Controller :
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)
}

从父 View Controller 调用的删除方法:
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()
}

子 Controller 的日志方法:
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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com