5
transitionWithView内でrootViewControllerを変更するとビューがリークする
メモリリークを調査しているときsetRootViewController:に、遷移アニメーションブロック内で呼び出す手法に関連する問題を発見しました。 [UIView transitionWithView:self.window duration:0.5 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{ self.window.rootViewController = newController; } completion:nil]; 古いビューコントローラー(置き換えられるビューコントローラー)が現在別のビューコントローラーを提示している場合、上記のコードは提示されたビューをビュー階層から削除しません。 つまり、この一連の操作... Xがルートビューコントローラーになる XはYを表すので、Yのビューは画面上に表示されます を使用transitionWithView:してZを新しいルートビューコントローラにする ...ユーザーには問題ないように見えますが、Debug View Hierarchyツールは、YのビューがZのビューの背後、つまり内にまだあることを明らかにしUITransitionViewます。つまり、上記の3つのステップの後、ビューの階層は次のようになります。 UIWindow UITransitionView UIView(Yのビュー) UIView(Zのビュー) 移行時に、Xのビューは実際にはビュー階層の一部ではないため、これは問題だと思います。 のdismissViewControllerAnimated:NO直前にX に送信するtransitionWithView:と、結果のビュー階層は次のようになります。 UIWindow UIView(Xのビュー) UIView(Zのビュー) dismissViewControllerAnimated:X に送信(YESまたはNO)した場合、completion:ブロックで遷移を実行すると、ビュー階層が正しくなります。残念ながら、それはアニメーションを妨害します。解雇をアニメーション化する場合、それは時間を浪費します。アニメーション化しないと、壊れているように見えます。 私は他のいくつかのアプローチ(たとえば、ルートビューコントローラーとして機能する新しいコンテナービューコントローラークラスを作成する)を試していますが、機能するものは何も見つかりません。この質問は随時更新していきます。 最終的な目標は、提示されたビューから新しいルートビューコントローラーに直接移行することです。