10

環境
iOS 9.2
Xcode 7.2

ビュー階層からも削除しながら、UIWindow の rootViewControllerをアニメーションに置き換えようとしています。

class FooViewController: UIViewController
{
}

class LeakedViewController: UIViewController
{
}

次に、単純に AppDelegate で遷移を開始します

    self.window!.rootViewController = LeakedViewController()

    let fooViewController = FooViewController()

    self.window!.rootViewController?.presentViewController(fooViewController, animated: true){ unowned let window = self.window!
        window.rootViewController = fooViewController
    }

Instruments でこれをプロファイリングすると、rootViewController がまだメモリ内にあることに注意してください。

ここに画像の説明を入力

また、同じ問題が iOS 8.3 に存在し、まだ開いていることを示唆しているように見えるこのバグ レポートに遭遇しました。

の一部としてそれを示唆する参考文献を見つけることができませんでした

UIViewController.presentViewController(animated:completion:) 

ソースView Controllerが保持されているか(おそらくUIPresentationControllerによるものです?)、またはこれがバグである場合。UIPresentationController が iOS 8 で最初に導入されたことに注意してください。

それが仕様によるものである場合、ソース ビュー コントローラーを解放するオプションはありますか?

UIPresentationController のサブクラスを使用する

override func shouldPresentInFullscreen() -> Bool {
    return true
}

override func shouldRemovePresentersView() -> Bool {
    return true
}

違いはないようです。SDK で他に何かを見つけることができませんでした。

現在、私が見つけた唯一の方法は、移行を行う前に、ルートビューコントローラーの代わりに、現在画面に表示されているもののスナップショットを使用して UIViewController を使用することです。

    let fooViewController = FooViewController()

    let view = self.window!.snapshotViewAfterScreenUpdates(false)
    let viewController = UIViewController()
    viewController.view.addSubview(view)

    self.window!.rootViewController = viewController
    self.window!.rootViewController?.presentViewController(dashboardViewController!, animated: true){ unowned let window = self.window!
        window.rootViewController = fooViewController
    }

コンソールに次の警告が表示されますが、機能します

Unbalanced calls to begin/end appearance transitions for <UIViewController: 0x79d991f0>.

元の質問または警告メッセージに関するアイデアは大歓迎です。

アップデート

リリースが欠落しているこの 1 つの保持に絞り込んだと思います。

ここに画像の説明を入力

それは、問題のある呼び出しの可能性です。

 0 UIKit -[UIPresentationController _presentWithAnimationController:interactionController:target:didEndSelector:]
4

3 に答える 3