如何取消初始化子 UIViewController



我有几个UIViewController被添加到内容视图中。调用我的 remove 函数后,我注意到除非我明确将子UIViewController的值设置为 nil,否则不会调用子UIViewControllerdeinit函数。

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

func removeViewController(fromCell cell:UICollectionViewCell, at indexPath:IndexPath){
    guard let childViewController = currentViewControllers[indexPath] else { return  }
    print("remove view controller called")
    childViewController.willMove(toParent: nil)
    childViewController.view.removeFromSuperview()
    childViewController.removeFromParent()
    currentViewControllers[indexPath] = nil
    // recycledViewControllers.insert(childViewController)
} 

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

  • 由父视图控制器自动维护的引用(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操纵,使其仅对其值进行引用(通过使用 NSMapTable 而不是字典(。

苹果的文档说:

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

取消初始值设定项是在实例解除分配发生之前自动调用的。不允许自己调用取消初始值设定项。

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

相关内容

  • 没有找到相关文章

最新更新