6

iOS6 / iOS6 アプリで NIB ファイルと一緒に複数のストーリーボードを混在させています。

複数のストーリーボードでメモリ管理はどのように機能しますか?

  • ストーリーボードAを起動したときに、別のnibファイルに戻ったり、別のストーリーボードに移動したりした場合、そのストーリーボードAはメモリ内にそのまま残りますか?
  • UIViewControllers を使用してナビゲーション コントローラーのスタック内のビューの配列を取得できる方法で、スタック内のストーリーボードの「配列」を取得できますか?
  • メモリ管理のために、ストーリーボードをメモリからポップまたは削除できますか? 別のストーリーボードに移動するときに nil に設定しますか?

複数のストーリーボードを nib ファイルと混合して使用している理由:

  • 複雑なストーリー ストーリーボード フローが必要です。それらをすべて一箇所にぶつけても意味がありません。
  • 最終的には、さまざまな人々と仕事をすることになり、チームワーク、複数のストーリーボード ルートを選択するのに十分説得力のあるバージョン管理についての議論を見つけることができます。
  • ストーリーボードはまだ複雑な nib ファイルや多くのプログラム ビューなどで動作しないため、NIB ファイルを混在させています。

私のコード スニペット

InitialNibFile.m 内 <-- appdelegate から起動されます。

- (IBAction)newStoryboardBtnPressed:(id)sender {

[self.view removeFromSuperview]; // here I remove this view from the superview to save memory
UIStoryboard *newStoryboard = [UIStoryboard storyboardWithName:@"NewStoryboard" bundle:nil];
UIViewController *initialSettingsVC = [newStoryboard instantiateInitialViewController];

[self presentViewController:initialSettingsVC
                   animated:YES completion:nil];

 }

ここでは、ストーリーボード シーン内にある UIViewController ビュー内。

- (IBAction)anotherStoryboardBtnPressed:(id)sender {

    // I'm inside a storyboard right now. I'm calling another storyboard. 
    // can i remove this storyboard before i launch the otherone? will keeping 2 or 3 toryboards in memory cause a memory leak?

    UIStoryboard *settingsStoryboard = [UIStoryboard storyboardWithName:@"AnotherStoryboard" bundle:nil];
    UIViewController *initialSettingsVC = [settingsStoryboard instantiateInitialViewController];
    // i'm going to load this view controller modally
    // initialSettingsVC.modalTransitionStyle=UIModalTransitionStyleFlipHorizontal;
    [self presentViewController:initialSettingsVC
                       animated:YES
                     completion:nil];

}
4

3 に答える 3

7

だからここに行く=)

ストーリーボードAの起動時に、別のnibファイルに戻る/別のストーリーボードに移動すると、そのストーリーボードAはメモリ内にそのまま残りますか?
ストーリーボードは、( ) プロパティを使用して作成した UIViewController によって保持されstoryboardます。そうです、すべてのView Controllerが解放されるまでメモリに残ります。(簡単な)ドキュメントを確認してください。

UIViewControllers を使用してナビゲーション コントローラーのスタック内のビューの配列を取得できる方法で、スタック内のストーリーボードの「配列」を取得できますか?
いいえ、ストーリーボードは互いに独立しているためです。ただし、nav スタック内のビュー コントローラーを反復処理することで、ストーリーボードを取得できます。

メモリ管理のために、ストーリーボードをメモリからポップまたは削除できますか? 別のストーリーボードに移動するときに nil に設定しますか?
インスタンス化されたView Controllerがメモリ内にある限り、それは残ります。storyboardWithName:自動解放されたオブジェクトを使用すると、返されます。ビュー コントローラはそれを保持するので、解放または nil への設定について心配する必要はありません。

あなたの他の質問への参照については、SO とインターネットの残りの部分に
従います

ハッピーストーリーボード。

于 2012-12-06T20:24:35.520 に答える
4

不要なView Controllerをメモリに保持しないようにしようとしているようです。ビュー コントローラーは他の多くのオブジェクトを参照するという意味で大きいため、これは避けるべき素晴らしいことです。あなたの質問は、スターボードがストーリーボード内のすべてのビュー コントローラーを参照することを心配しているように聞こえます。そうではありません。ストーリーボード オブジェクトは、アプリ バンドルのリソース ディレクトリ内のファイルへの単なる参照であり、新しいビュー コントローラーの作成を要求されるたびに、それらのリソースから新しいビュー コントローラーをインスタンス化します。たとえば、ストーリーボードから同じテンプレート ビュー コントローラーを複数回インスタンス化できます。インスタンス化された後は、ライブ ビュー コントローラーを保持しません。

于 2012-12-06T20:43:21.213 に答える