2012-01-11 39 views
2

我有一個UIViewController,它應該延遲加載視圖,然後將其保存在內存中,因爲它經常重複使用,直到出現內存警告,或者出於某種其他原因想要清除它。爲了實現延遲加載,我覆蓋了默認的getter。這裏是我的代碼:在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 

現在我的問題基本上是:它仍然是正確的釋放myView像我在做- (void)didReceiveMemoryWarning或我將不得不[_myView release]; _myView = nil;甚至完全不同的東西?

此外,這通常是使用惰性初始化的正確方法,或者我應該改進一般情況嗎?

回答

3

您的釋放記憶的說法是絕對正確的,兩者之間沒有區別。

self.myView = nil; 

在這種情況下爲myView屬性的setter方法將被調用,並且類似於如下。

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

爲懶加載...我猜-(void)viewDidDisappear釋放的看法和其他內存相關的東西,-(void) loadview再重新創建它們

3

如果我沒有記錯的默認UIViewController行爲已經懶洋洋地加載視圖,看到the documentation-loadView

你永遠不應該直接調用此方法。視圖控制器在請求視圖屬性時調用 此方法,但當前爲零。