2012-12-06 10 views
5

iOS6/iOS6アプリで複数のストーリーボードとNIBファイルを混在させています。複数のストーリーボード(iOS +メモリ管理)

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

  • 私は別のnibファイルに戻す場合は、/別のストーリーボードに行き、storyboardAだけのメモリにそこに滞在していることでしょうか?
  • ストーリーボードの "配列"を私はUIViewControllersでナビゲーションコントローラのスタック内のビューの配列を取得できる方法を得ることができますか?
  • メモリ管理のために、ストーリーボードをメモリからポップまたは削除できますか?別のストーリーボードに行くと、それを無しに設定しますか?私はnibファイルと混合し、複数のストーリーボードを使用していますなぜ

理由は:

  • 私は、複雑な物語のストーリーボードの流れをしたいです。それらをすべて1つの場所に押し込むことは理にかなっていません。
  • 最終的に私は多くの人と一緒に作業し、複数のストーリーボードルートを選択するのに十分なバージョン管理をお勧めします。
  • NIBファイルは、ストーリーボードがまだ複雑なnibファイル等、多くのプログラムビュー、

私のコードスニペットは

インサイドInitialNibFile.m < - appdelegateから起動されます。ストーリーボードのシーン内でのUIViewControllerビューインサイドここ

- (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]; 

} 

、 。私は別のnibファイルに戻す場合

- (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]; 

} 

答えて

7

そこでここでは=行く)

storyboardAを起動すると、/別のストーリーボードに行き、storyboardAだけのメモリにそこに滞在していることでしょうか?
ストーリーボードは、(storyboard)プロパティを使用して作成したUIViewControllerによって保持されます。だから、それはすべてのビューコントローラがdeallocされるまでメモリ内に留まります。 (簡潔な)documentationを調べてください。

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

メモリ管理のために、ストーリーボードをメモリからポップまたは削除できますか?別のストーリーボードに行くと、それを無しに設定しますか?
メモリ内にインスタンス化されたビューコントローラを持っている限り、それは残っています。storyboardWithName:を使用すると、自動リリースされたオブジェクトが返されます。ビューコントローラはそれを保持しますので、解放することやnilに設定することは心配しないでください。あなたの他の質問への参照のために

、私はへのSOとインターネットの残りの延期:
Best Practices for Storyboards on SO
UIStoryboard best practices
Multiple Storyboards in iOS on SO

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

+0

本当にありがとうございましたMishieMoo!これは多くの助けとなりました。 –

+0

あなたの質問に答えたら答えを受け入れるようにしてください=) – MishieMoo

+0

天才の答え...いい仕事... –

4

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

+0

ありがとうジョン!私は助言を守り、ナビゲーションスタックアレイのビューコントローラの数を数えるログを記録しました。あなたが言っていることは今、意味を成し遂げています! –

1

あなたは、メモリ内の不要なView Controllerを維持避けるしようとしているようですね

それはそれがインスタンス化されます一度ストーリーボードは、アプリケーションの寿命のためにメモリに保持されていることを認識することが重要です。それがあなたが望むものでない場合は、静的定数プロパティを静的な計算プロパティに変えることができます。ストーリーボードの拡張を作成します。アプリケーションをメモリをきれいにするように、ビューコントローラに適用することもできます。

import UIKit 

extension UIStoryboard { 

static var main: UIStoryboard { 
    return UIStoryboard(name: "Main", bundle: Bundle.main) 
} 

}