2010-06-01 75 views
3

如果我有如下一個的viewController設置:內存管理&viewDidUnload?

@interface MapViewController : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate> { 
    CLLocationManager *locationManager; 
} 

-(void)viewDidLoad { 
    [super viewDidLoad]; 
    locationManager = [[CLLocationManager alloc] init]; 
} 

,當涉及到內存管理,我應該將釋放兩個viewDidUnload & dealloc的?

-(void)viewDidUnload { 
    [locationManager release]; 
    locationManager = nil; 
    [super viewDidUnload]; 
} 


-(void)dealloc { 
    [locationManager release]; 
    [super dealloc]; 
} 

歡呼加里

編輯:

[超級的dealloc]移至底部按院長類的意見。

+0

只要注意 - 你應該把[超級dealloc]作爲_last_行在你的dealloc方法中。否則,當您嘗試釋放locationManager時,您可能會遇到崩潰,因爲內存可能已經被另一個對象使用。 (非常不可能,但需要注意的地方) – deanWombourne 2010-06-01 14:44:16

+0

謝謝Dean,我的錯誤,但需要記住的好,再次感謝。 – fuzzygoat 2010-06-01 15:16:52

+0

@dean:如果尚未發佈locationManager,那麼locationManager的內存如何用於另一個對象? (指發佈的原始代碼) – progrmr 2010-06-01 16:54:36

回答

6

簡短的回答:

除非你正在創建/其保留在viewDidLoad中(或XIB),不viewDidUnload釋放。

龍答:

viewDidUnload用於釋放任何在創建視圖時,你可能已經做出 - 這包括在viewDidLoad中的東西,但也包括那是從廈門國際銀行文件中創建IBOutlet中的屬性。這些應該全部被釋放並且在viewDidUnload中設置爲零。

其他任何東西都應該在dealloc中發佈。

這個想法是,如果調用viewDidUnload來釋放一些內存,視圖可以從您的viewDidLoad方法中再次完全重新創建。

+0

我可以澄清你的答案,我實例化viewDidload中的locationManager,所以它的權利釋放它在viewDidUnload(如果視圖被卸載),也有權釋放它在dealloc它的應用程序退出視圖仍然加載的情況下? – fuzzygoat 2010-06-01 15:29:58

+0

如果你在viewDidLoad中實例化它,那麼是,在viewDidUnload中釋放它(假設你不想在位圖更新之前再次加載視圖!)。而你又是對的 - 釋放它在dealloc :) – deanWombourne 2010-06-01 15:52:22

+0

謝謝,非常感謝。 – fuzzygoat 2010-06-01 16:23:36

5

viewDidUnload您應該將您的IBOutlet屬性設置爲零,並且在viewDidLoad中初始化任何東西。

請記住,如果手機內存不足,您的視圖將被卸載,如果它不在屏幕上。下次再次加載視圖時,新視圖將連接到IBOutlets,並且viewDidLoad將再次被調用。因此,您應該在viewDidUnload中將插座屬性設置爲零以減少內存佔用量。

0

這個傢伙在做self.object = nil之前正在做[object release]

是第一次發佈什麼?在Apple文檔中,它們僅影響變量的nil ...什麼是正確的?

+1

如果你的實例變量被聲明爲@property(retain),那麼你可以簡單地使用[self setMyVariable:nil];這將釋放舊對象並保留零。在我上面的例子中,我沒有使用@property,因此手動發佈和nil。 – fuzzygoat 2010-06-07 10:03:24

+0

locationManager = nil不會導致它被釋放,因爲它直接在伊娃上運行。所以你需要明確地釋放它,或者使用mutator([self setLocationManager:nil]或self.locationManager = nil)來釋放先前保留的值。我個人更喜歡他的例子中的版本([locationManager release],locationManager = nil),因爲它更明確地說明了發生了什麼。 – 2011-01-03 22:37:49