gpt4 book ai didi

ios - Swift iOS - 当作为 subview Controller 添加到另一个 View Controller 时,是否应该在 subview Controller 中调用 Deinit?

转载 作者:搜寻专家 更新时间:2023-10-31 22:39:48 25 4
gpt4 key购买 nike

我在另一个 parentVC(vc1) 中的 parentVC(vc2) 中有一个 childVC(vc3)。我这样做是为了制作动画。

发生的事情是我将 vc3 作为子级添加到 vc2。我有一个推送 vc1 的 collectionView。一旦 vc1 出现在场景中,vc2 就会被添加到其中。当我从堆栈中弹出 vc1 并返回到 collectionView 时,vc1 中的 deinit 被调用,但是 vc2 中的 deinit 永远不会被调用。

vc2 中的 deinit 是否应该被调用,即使它是 vc1 的子级?或者可能是因为第三个 VC 在第二个 VC 内部创建了对自身的强引用?

在其中添加了 ThirdVC 的 SecondVC:

class SecondController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()

let thirdVC = ThirdController()
addChildViewController(thirdVC)
view.addSubview(thirdVC.view)
thirdVC.didMove(toParentViewController: self)
}

// this never runs when the firstVC is popped off the stack
deinit{
print("the secondVC has be deallocated")
}
}

Collection View :

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

let firstVC = FirstController()
navigationController?.pushViewController(firstVC, animated: true)
}

第一风投:

class FirstController: UIViewController {

override func viewDidLoad() {
super.viewDidLoad()

let secondVC = SecondController()
addChildViewController(secondVC)
view.addSubview(secondVC.view)
secondVC.didMove(toParentViewController: self)
}

// this runs when popped off the stack
deinit{
print("the firstVC has be deallocated")
}
}

最佳答案

我的问题的答案是是的, subview Controller 的 deinit 也应该运行。如果您在 subview Controller 中调用 deinit 并且当父 View Controller 弹出场景(或被解雇)并且 child 的 deinit 没有运行,那么你就有问题了。

正如@BadhanGanesh 在评论中指出的那样:

您是否在使用任何通知观察器,但您在不需要时未能将其移除

@Bruno Pinheiro 在评论中建议:

好像是一个很强的引用问题

他们都是对的。我查看了所有代码,我以为我已经删除了 KVO 观察器,但我没有。

长话短说,如果您有一个 View Controller 是另一个 View Controller(父级)的子级,那么一旦父级被释放,那么子级也应该被释放。

如果您在父级或子级内部使用任何 KVO 观察器,请确保将它们移除,否则您将创建一个强大的保留循环。

关于ios - Swift iOS - 当作为 subview Controller 添加到另一个 View Controller 时,是否应该在 subview Controller 中调用 Deinit?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49278938/

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