2012-04-14 10 views
1

私は受け取っているメモリ警告を避けるためにnavigationViewControllerに持っている私のmainViewControllerのビューを解放する必要があります。UIViewControllerビュー - > loadView vs viewWillAppear

ビューをロードする良い練習は 'loadview'メソッドですが、(self、view = nil)を実行してビューをdeallocしようとすると(スタックの次のコントローラに移動すると)、 'loadview'メソッドは何も起こりません。

私は「viewWillAppear」メソッドでビューをロードし、この問題を解決し、しかし、私の質問は:

正しいという手順ですか? そうでない場合(私が思う)、そのビューを解放してメモリを解放するにはどうすればよいですか?

どのような方法で解決するのがベストですか?

これはコードです:

'loadViewメソッド'

- (void)loadView 
{ 
    [super loadView]; 
    (some more code) 
} 

ビューをビューをロードせずに、それがここでロードされている

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 

    if (!pral) 
    { 
     pral = [[TouchDrawView alloc] initWithFrame:[UIScreen mainScreen].bounds]; 
      [self setView:pral]; 
      [pral release]; 
    } 
     (some more code) 
} 

これは、次のViewControllerを呼び出しですスタック

- (void)menus:(id)sender 
{ 
    opcions *ops = [[opcions alloc] init]; 
    [[self navigationController] pushViewController:ops animated:YES]; 
    [ops release]; 

//Here I'm trying to free memory releasing the view 
    [pral removeFromSuperview]; 
    pral = nil; 
    self.view = nil; 
} 

ありがとう

答えて

0

カスタムサブビューを構築するためのより良いフックは、viewDidLoadです。

最低でも、didReceiveMemoryWarningとdeallocに残っているサブビュー(プリARC前)を解放する必要があります。

新しいviewControllerにプッシュするときに解放する必要はありません。古いものはまだそこにあります。

+0

はい、私の古いものはそこにありますが、メモリリソースを消費するだけでなくそこにいるという見解は必要ありませんか? (それは画面に表示されません)。だから、私がよく理解していれば、何もしないで、メモリ警告が受信されたときに「反応する」ことは良い習慣ですか? – Kanick

+0

メモリ警告(viewDidUnloadを起動します)を受け取っても問題ありません。その警告を受け取るまでメモリの問題がないので、処理する必要はないからです。必要がなくなったときに処分した場合、再ロードする(遅延する)必要があるか、悪化するなど、他の問題が発生する可能性があります。リロードするのが難しい情報(親VCから来た可能性があります) 。 – SomaMan

+0

@SomaMan、はい、それは理にかなっています。すべてのそのような迅速な応答に感謝します。 – Kanick

0

あなたは自動的にアンロードするので、ビューをアンロードする必要はありません。ちょうどViewdidUnloadメソッドでメモリを含むオブジェクトを解放する必要があります。

+0

はい、私は(単純なnaviagationControllerアプリで)ViewDidUnloadがメモリ警告のためにアンロードされない限り、呼び出されないと思います。そして私はそのような状況を避けようとしていました。 – Kanick

関連する問題