4

私は自分のアプリをストーリーボードに移動していますが、これまでのところ、とても良いです。

しかし、私は本当に理解できない何かを見つけて、私を心配しています。誰かがこれについていくつかの洞察を提供できれば幸いです。

私のアプリは通常のナビゲーションコントローラーを使用しています。新しいViewControllerに「進む」ために、カスタムセグエを使用しています。そこに問題はありません。ただし、アプリには、ナビゲーションスタックの最初に戻りたいポイントがあります。また、カスタムセグエを使用してその「ナビゲーション」を構成しました。そのために、最後のビューコントローラーを最初のビューコントローラーにドラッグしてインターフェイスビルダーでセグエを作成し(すでに奇妙に見えます)、カスタムセグエを実装しました。次の方法でメソッドを実行します。

-(void)perform
{
    UIViewController *src = (UIViewController *)self.sourceViewController;
    UIViewController *dest = (UIViewController *)self.destinationViewController;

    [src.navigationController popToRootViewControllerAnimated:NO];
    // Custom animation code here
}

...それは素晴らしい働きをします。しかし、なぜそれが機能するのかわかりません。私の考えでは、カスタムセグエは、最初のView Controllerの新しいインスタンスをインスタンス化し、それを「宛先」として割り当てる必要がありますが、セグエは、以前の既存のインスタンスに移動したいことを理解するのに十分賢いようです。 View Controllerは、新しいインスタンスを作成する代わりに、既存のインスタンスを「宛先」に割り当てます。

このようにセグエを使っても大丈夫かどうか誰か知っていますか?偶然に機能する可能性はありますが、将来は機能しなくなる可能性がありますか?セグエが使用しないViewControllerをインスタンス化しているので、とにかくメモリを無駄にしていますか?

よろしくお願いします!

4

1 に答える 1

2

  • とにかく、セグエが使用しないView Controllerをインスタンス化しているので、メモリを無駄にしていますか?

かしこまりました!DestinationControllerセグエを使用することで、カスタム セグエのプロパティを設定する必要があるため、新しいビュー コントローラーを効果的に割り当てます。自分でテスト: 静的カウンターをルート コントローラーに追加し、このクラスが初期化されるたびにインクリメントしてビューに表示します。このトリックを使用してルートにポップするたびにインクリメントされることがわかります。

  • この方法でセグエを使用しても問題ないかどうかは誰にもわかりませんか?

効果的にメモリを浪費している限り、いいえ!

この問題には少なくとも 1 つの解決策があります。実装DestinationControllerでセグエを解放します(void)perform。これは本当に簡単に実装できますが、毎回ビュー コントローラーを割り当ててすぐに解放するので、ちょっと見苦しいです... リークするよりはましだとしても、良い習慣とは言えません! 私の考えでは、あなたが望むものを達成するためのより良い方法は、そのトランジションにセグエを使用せず、ボタンなどを使用して、popToRootViewController:animatedこのボタンに触れたときに呼び出すことです。

  • たまたま機能する可能性がありますが、将来機能しなくなる可能性はありますか?

私が提案した最初の解決策とあなたが現在行っている方法の両方について、理由はまったくありません。これらは複雑な調整ではなく、単に「実装が悪い」標準ナビゲーションです。2 番目の解決策は完全に正常なので、心配する必要はありません。

于 2012-05-04T08:30:46.380 に答える