iOS: ViewController хранится по ссылке - PullRequest
0 голосов
/ 28 мая 2019

У меня есть viewcontroller A, где я добавляю представления динамического контроллера других viewcontrollers в subView A. По соображениям эффективности я храню эти viewcontrollers в словаре и динамически удаляю / добавляю их представления.

Однако A деинициализируется, но не другие контроллеры представления. Я также вижу это в отладчике памяти, но не знаю, как решить этот цикл.

retain cycle

Вот мой словарь внутри A, который содержит все контроллеры подпредставления:

private var subControllerMap = [String:UIViewController?]()

А вот как я делаю эту динамическую загрузку

 func addControllerWithIdentifierAndZoneId(_ identifier: String, storyboardNibName: String, containerView: UIView,zoneId: String?){
        containerView.subviews.first?.removeFromSuperview()
        let _ = children.map{$0.removeFromParent()}
        var ctrlr: UIViewController? = subControllerMap[identifier] as? UIViewController

        //only create a new controller if needed - otherwise use reference from map
        if ctrlr == nil{
            let storyboard = UIStoryboard(name: storyboardNibName, bundle: nil)
            ctrlr = storyboard.instantiateViewController(withIdentifier: identifier)
            subControllerMap[identifier] = ctrlr
        }
        guard let controller = ctrlr else{
            return
        }

        if let castedController  = controller as? BController {
            castedController.isInEditMode = true
        }else if let castedControler = controller as? CController{
            castedControler.isInEditMode = false
        }else if let castedController = controller as? DController{
            castedController.isInEditMode = true
        }

        controller.view.translatesAutoresizingMaskIntoConstraints = false
        addChild(controller)
        addSubview(subView: controller.view, toView: containerView)
        controller.didMove(toParent: self)
    }

Эта функция вызывается, если я нажимаю сегмент на сегментированном элементе управления. Э.Г.

addControllerWithIdentifierAndZoneId("BController", storyboardNibName: "Room", containerView: containerView,zoneId: zoneId)

Я пытался убрать в vieDidDisappear, но это не помогло

override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)

    subControllerMap.values.forEach { (controller) in
        controller?.view.removeFromSuperview()
        controller?.removeFromParent()
    }
    subControllerMap.removeAll()
    containerView.subviews.forEach { (view) in
        view.removeFromSuperview()
    }
    containerView.removeFromSuperview()

}
...