Проблема в том, что у вас есть две ссылки на контроллер дочернего представления:
Ссылка поддерживается автоматически родительским контроллером представления (childViewControllers
или children
в современном Swift)
Дополнительная ссылка, которую вы сами добавили (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 словаря).