質問: swiftを勉強している者です。 Debug View Hierarchyで制作中のアプリを見た時、 「UITransitionView」、「UIViewControllerWrapperView」というViewが複数存在している事に気づきました。 (自分のアプリでは10枚くらいありました) 画面ごとにアプリを止めたりして調べてみると、画面遷移する度に増えることがわかったのですが、 以下の様なことが調べてもよくわかりません。 * このViewは一体何のために存在するのか * 複数生成されてしまったときに、動作が重くなるなどの不具合は発生するのか * 発生する場合、対策はどうすればいいのか お分かりの方がいらっしゃいましたらぜひご教授頂きたく思います。 よろしくお願い致します。
回答: > > このViewは一体何のために存在するのか > > > で説明されているように、UITransitionViewは`presentViewController()`を実行するだけで作られます。 `presentViewController()`で表示された遷移先画面は、役目が終われば通常は`dismissViewControllerAnimated()`を実行して遷移元の画面に戻るので、その際にUITransitionViewも消滅します。しかし、元の画面に戻らないまま、遷移先の画面からさらに新しいビューコントローラーを生成して`presentViewController()`で画面遷移すると、さらに新しいUITransitionViewが作られます。 もし10個もUITransitionViewがあるのなら、おそらく元の画面に戻らないまま、どんどん`presentViewController()`を実行し続ける画面遷移構造になっているのではないかと推測します。 UITransitionViewが何のために存在しているかについては、これはSDKの内部で生成しているクラスでありAppleのドキュメントに説明されていないので詳しくわかりません。おそらく画面遷移を戻るときに戻り先のビューへの切り替えアニメーションに使っているのだろうと推測します。 > > 複数生成されてしまったときに、動作が重くなるなどの不具合は発生するのか > > 発生する場合、対策はどうすればいいのか > > > もし`dismissViewControllerAnimated()`で戻ることなく`presentViewController()`で新しい画面に遷移し続ける構造になっているのであれば、UITransitionViewだけでなく遷移元のビューコントローラーやそこで表示されているビュー等、いろいろなオブジェクトが遷移先画面からの戻りをずっと待っている状況です。いずれ遷移元に戻る予定ならそれでよいですが、既に不要な画面で戻る予定がないのに待たせたままになっているなら、そのまま使い続けることでいずれメモリ不足になる可能性があります。 現在の画面が不要になって新しい画面に遷移したい場合は、一旦親のビューコントローラーに戻って、子供を消滅させた後、元の親から再度新しい子供を生成して画面遷移するような画面設計に見直すことをお勧めします。 なお、「UIViewControllerWrapperView」の方は、UINavigationControllerを使った時にSDK内部で生成されているのを見たことありますが、これが10個も同時に作られている状況はあまり見たことないです。 (こちらは、pushViewControllerで画面遷移してもUIViewControllerWrapperViewが増えることはありません) `presentViewController()`でUINavigationControllerを何個も生成しているならそういう状況になるかもしれませんが、詳しい画面遷移構造が説明されていないので、これ以上推測の話をするのはやめておきます。