5

多くの画面と多くのセグエ オプションを備えた iPad アプリがあります。現時点では、performSegueWithIdentifier を使用してこれらのセグエを開始しているだけですが、ユーザーがセグエを実行するたびに多くのメモリを消費しているのではないかと心配しています。UINavigationController を使用している場合、関数 popToRootViewControllerAnimated: を使用することを人々が推奨していることを見てきましたが、問題は私が使用していないことです。VC の増殖を止めるにはどうすればよいですか? アプリの動作方法では、ユーザーは常にルート VC (実質的には検索画面) に戻ります。したがって、そのようなセグエが必要なときにVCのスタックをクリアできれば、それで問題は解決すると思いますが、どうすればよいかわかりません。提案をありがとう。

4

4 に答える 4

10

セグエを使用している場合、フローは前後に移動します。ユーザーが後方に移動すると (つまり、「戻る」を押す)、新しい VC にプッシュされませんが、既存の VC にポップされます。ポップすると、現在の VC がスタックとメモリから削除されます。

フローの後方に移動するセグエがある場合、これは間違っています。先に進むには、セグエのみが必要です。

セグエの適切な準備

セグエに備えて、独自のView Controllerを作成してプッシュしないでください。ストーリーボードは、これらすべてを行うためにあります。

適切な prepareForSegue メソッドは次のようになります...

- (void)prepareForSegue:(UIStoryBoardSegue*)segue
{
    if([segue.identifier isEqualToString:"SomeSegue"])
    {
        MyNewViewController *controller = segue.destinationViewController;

        controller.someProperty = "some value to pass in";
    }
}

必要なのはそれだけです。これは、新しいView Controllerに情報を渡す場合にのみ必要であることに注意してください。何も渡さない場合は、このメソッドはまったく必要ありません。

メソッドが終了すると、ストーリーボード ファイルによって新しい VC が画面にプッシュされます。

セグエの巻き戻し

(コメントのように)ランダムなフローがある場合は、巻き戻しセグエを使用してこれを実現できます。

あなたの「A」View Controllerには次のような機能があります...

- (IBAction)someUnwindAction:(UIStoryboardSegue*)sender
{
    //some action to run when unwinding.
}

UIStoryboardSegue オブジェクトを受け取る必要があります。IBAction として設定すると、Interface Builder からもアクセスできます。

A > B > C > B > A に移動したい場合は、標準のプッシュとポップ (セグエと戻るボタンから) を使用します。

A > B > C > A に移動する場合は、コントローラー C からアンワインド セグエを使用できます。

コントローラー C にキャンセル ボタンまたは何かがあり、これが Interface Builder にあり、コントローラー A に戻る場合、コントローラー C の下の Interface Builder には、ドアと矢印が指す小さな緑色の四角形があります。それから。キャンセル ボタンのアクションをこのシンボルに向けて、「someUnwindAction」を選択するだけです。(注、unwindAction は A にあり、button は C にあります。)次に、XCode はこれを使用して A に戻り、メモリなどの削除を処理します。必要に応じて、追加情報を A に返送することもできます。

プログラムで C からこのアンワインド セグエにアクセスしたい場合は、次を実行できます...

[self performSegueWithIdentifier:"someUnwindAction" sender:nil];

これもAに戻ります。

于 2013-01-01T10:36:53.350 に答える
1

セグエの使用に問題はありません。他の何よりもはるかに簡単です。消費されるメモリが心配な場合は、アプリをプロファイリングして、消費する量と「メモリ プレッシャ ハンドラ」が呼び出される頻度を確認してください。

于 2013-01-01T11:26:09.957 に答える
0

わかりました、私はこれを理解したと信じています。うまくいくようです。

共通の VC に戻り続けるので、VC スタックをクリアするために、この「ルート」VC に戻りたい場所にコードを配置しています。

通常のコードで実際のセグエを実行します

[self performSegueWithIdentifier:@"editBackToSearch" sender:self]; 

ただし、「prepareForSegue:」メソッドでは、新しい VC オブジェクトを作成するのではなく、未処理の作業を実行 (データを保存) してから、次のコードで VC スタックをクリアします。

UIViewController *vc = self;
while ([vc presentingViewController] != NULL)
{
    vc = [vc presentingViewController];
}   
[vc dismissViewControllerAnimated:NO completion:nil];

スムーズに実行されているように見え、これらの VC が吸い上げたメモリを解放するという望ましい効果 (プロファイラーで確認) があります。

最後のコメント - 何らかの理由で、却下コマンドをアニメーション化できませんでした。これにより、無限ループがトリガーされ、EXC_BAD_ACCESS が発生したように見えました。アニメーションを NO に設定すると、うまく機能します。

ご協力いただきありがとうございます。

于 2013-01-02T01:48:31.027 に答える