2011-05-12 35 views
1

我對蘋果的文檔頁面發現他們解除分配的內存如下的例子:iOS:爲什麼我應該首先在viewDidUnload然後釋放dealloc方法?

- (void)viewDidUnload 
{ 
    self.mapAnnotations = nil; 
    [super viewDidUnload]; 

    // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand. 
    // For example: self.myOutlet = nil; 
} 

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

我想知道爲什麼

  1. 他們首先設置mapAnnotation爲零的viewDidUnload然後他們以dealloc方式發佈並且

  2. 爲什麼它們引用mapAnnotation有沒有自己。

這是可下載的例子的方式:MapCallouts Example

回答

2

你應該問的問題是:當viewDidUnload叫什麼名字?

總之,它被稱爲低內存的情況下,你不想釋放整個控制器,即當你想要dealloc被調用。

你能想到的viewDidUnload作爲的loadViewviewDidLoad相反,而deallocinit相反。 (實際上它可能比當然更復雜一些。)

0

(1)這樣做是爲了讓您可以放棄引用,以便系統可以在內存不足的情況下釋放資源。它是viewDidLoad的倒數:

(2)如果您使用點符號引用self,則可能會創建一個對象,該對象是該屬性的實現細節。使用名稱可確保您釋放對象本身,而不是該屬性返回的對象。在第一個例子中,在插座的情況下,用點符號(self)賦值nil將遞減保留屬性的保留計數。

2

viewDidUnload可以被認爲是viewDidLoad的反義詞。它在由於內存警告而卸載視圖的情況下調用,但視圖控制器實際上未被釋放。

它允許您釋放僅在視圖加載時才相關的內存,因此允許您在這些內存不足的情況下釋放內存。

至於兩個版本之間的差別,一個使用self和一個不:

viewDidUnload方法中,通過它的存取方法的變量被設置爲nil。該變量已被聲明爲屬性,可能具有retain屬性。當通過屬性分配nil,它的功能也可以通過下面的代碼:

- (void)setMyObject:(MyObject *)object 
{ 
    [myObject release]; 
    myObject = [object retain]; 
} 

所以,如果你傳遞nil該方法,你會被釋放舊實例和變量賦值零。在釋放之後分配nil被認爲是防止任何嘗試取消引用dangling pointer的好方法。

dealloc方法中,變量是直接訪問的,而不是通過訪問方法或屬性,並且被釋放。在這一點上沒有必要指定nil,因爲擁有的對象將被釋放,並且不會訪問它的任何指針,從而導致對懸掛指針的取消引用的可能性非常低。

相關問題