2009-10-23 53 views
1

我有幾個有關UIViewController的問題:幾個問題:UIViewController的生命週期;釋放vs設置爲零

1)何時調用UIViewController的每個方法?具體來說,viewDidLoad,viewDidUnload和dealloc之間的區別。

2)有什麼區別,一般,當設置一個指針等於零和釋放指針?我知道在viewDidUnload中,你應該將它設置爲等於零,但是在dealloc調用版本中。

更新:對不起,剛剛意識到這個問題是誤導。而不是dealloc,我的意思是 - 什麼時候initWithNibName:bundle和release被調用?只有一次IB,對吧?

回答

1

將指針設置爲零不會釋放它指向的內存。

當你做這樣的事情

self.pointer = nil; 

它通常是該酒店有保留屬性的情況下。當在這種情況下,屬性設置爲nil將間接引起

[pointer release]; 
pointer = nil; 

在視圖控制器方法的情況下,當你的視圖被加載時,viewDidLoad中被調用,無論是從一個筆尖,或編程。更具體地說,它在調用-loadView之後被調用。您不需要手動調用loadView,系統會執行此操作。 viewDidUnload方法在發生內存警告時調用,並且視圖控制器的視圖不在屏幕上。隨後,loadView和viewDidLoad將在需求時再次被調用。

dealloc方法,爲正常,當你的對象的保留計數到達0

+0

對不起,我瞭解除了將它設置爲零和調用發佈之間的區別之外的所有內容。最後,不管你用哪種方式來調用發佈版本嗎?那麼爲什麼self.pointer = nil而不僅僅是[指針釋放]? – jasonbogd 2009-10-23 22:39:26

+0

您應該閱讀objective-c內存管理和objective-c 2.0屬性。 只需將指針設置爲零,不會釋放它指向的內存。但是,如果將nil指定爲指定retain屬性的*屬性*,則在將指針指派給傳入的參數並調用retain之前,先前存儲的對象將收到一條釋放消息。在這種情況下,參數將爲零,所以前一個對象被髮送釋放,nil被分配給指針,然後在nil上調用retain(這是一個無操作,因爲發送消息到nil什麼都不做)。 – Jasarien 2009-10-24 11:46:22

1
pointer = nil; // just clears the variable in which you store the pointer, but does not free memory. 

[pointer release]; // just frees the object (memory), but does not clear the variable used to point to it. 

self.pointer = nil; // sets the variable to nil. Also releases the object ONLY if pointer is a @property(retain) ivar. 

一個簡單的方法,看看時會調用各種方法調用時要做到這一點在UIViewController:

- (void)viewDidLoad 
{ 
    NSLog(@"MyViewController::viewDidLoad"); 
    [super viewDidLoad]; 
    // the rest of your viewDidLoad code, here. 
} 

// Etc., for the other methods of interest. 

注意:可以從覆蓋保留&版本的日誌中收集很多內容,然後在調試器中進行跟蹤。