2012-01-11 6 views
2

私はUIViewControllerを持っています。ビューを遅延ロードして、それがメモリに保持されるようにする必要があります。メモリ警告が発生するか、他の何らかの理由でそれをクリーニングしたい。遅延読み込みを実現するために、デフォルトゲッターを上書きしました。ここに私のコードだ:UIViewControllerサブクラスのビューを遅延ロードする

@interface MyController { 
    MyView *_myView; 
} 
@property(nonatomic, retain) MyView *myView; 
@end 

@implementation MyController 
@synthesize myView = _myView; 
- (MyView *)myView { 
    if(_myView == nil) { 
     _myView = [[MyView alloc] init]; 
     // some more initialization 
    } 
    return _myView; 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // the main part of my interest, freeing myView again 
    self.myView = nil; 
} 
@end 

今、私の質問は基本的には次のとおりです。私は- (void)didReceiveMemoryWarningに行ったようmyViewを解放することが正しいですか私は[_myView release]; _myView = nil;、あるいは完全に異なる何かを持っているでしょうか?

また、これは一般に遅延初期化を使用する正しい方法ですか、ここで一般的に何か改善する必要がありますか?私はデフォルトUIViewController行動すでに間違えなまけビューをロードするわけではない場合

答えて

3

メモリを解放するためのステートメントは絶対に正しく、2つの間に違いはありません。

self.myView = nil; 

この場合myViewプロパティのセッターメソッドが呼び出されると、以下のように類似しています。遅延読み込みのため

-(void) setMyView:(MyView*) aMyView { 
    [myView release]; 
    myView = aMyView; 
} 

...私は再び

それらを再作成するビューと、他のメモリ関連のものと -(void) loadviewを解放するための -(void)viewDidDisappearを推測
3

-loadViewためthe documentationを参照してください。

あなたはこのメソッドを直接呼び出すことはありません。ビュー・コントローラーは、ビュー・プロパティーが要求されていて現在はnilであるときに メソッドを呼び出します。