如何取消初始化子UIViewController?

时间:2019-04-29 16:33:09

标签: ios swift uiviewcontroller automatic-ref-counting deinit

我有几个UIViewController被添加到内容视图中。调用删除函数后,我注意到子UIViewController的{​​{1}}函数没有被调用,除非我将子deinit的值显式设置为UIViewController

是正确的行为还是我做错了什么?

nil

2 个答案:

答案 0 :(得分:2)

问题是您有两个子视图控制器引用:

  • 父视图控制器(childViewControllers或现代Swift中的children)自动维护的引用

  • 您自己添加的其他参考(currentViewControllers)。

因此,在子视图控制器可能不存在之前,您必须让它们中的全部 离开。那就是你的代码所做的:

childViewController.willMove(toParent: nil)
childViewController.view.removeFromSuperview()
childViewController.removeFromParent()
// now `childViewControllers` / `children` has let go

currentViewControllers[indexPath] = nil
// now `currentViewController` has let go

因此,您本身并没有做错任何事情,除非您首先通过将此currentViewControllers添加到了此额外的强引用中。但我知道为什么要这样做:您想要一种将索引路径与子视图控制器配对的方法。

因此,您可以很好地接受您的方法,或者如果您确实愿意,可以将currentViewControllers设置为仅对其值进行 weak 引用(通过使用NSMapTable而不是字典)。

答案 1 :(得分:-1)

Apple's Documentation说:

  

Swift通过自动引用计数(ARC)处理实例的内存管理...

  

在实例解除分配发生之前,会自动调用反初始化器。不允许您自己调用反初始化器。

这基本上意味着您不能自己调用​​deinit()方法,除非对它们的零strong引用,否则不会将其初始化。