2010-05-16 76 views
7

澄清問題的跟進:跟進viewDidUnload與dealloc的問題

What exactly must I do in viewDidUnload? When should I release objects in -(void)viewDidUnload rather than in -dealloc?

所以我們說有一個內存不足的錯誤,並且認爲是隱藏的,並且viewDidUnload被調用。我們做釋放和無舞。後來整個視圖堆棧不再需要,所以調用dealloc。由於我已經在viewDidUnload中發佈了release和nil,所以我沒有在dealloc中使用它。完善。

但是,如果沒有低內存錯誤,則永遠不會調用viewDidUnload。 dealloc被調用,因爲我沒有釋放和零的東西,有內存泄漏。

換句話說,dealloc永遠會被調用,而不會首先調用viewDidUnload?

而實際的後續行動是,如果我在viewDidLoad中分配並設置了一些內容,並且將其釋放並在viewDidUnload中設置爲nil,我是否將它從dealloc中刪除,或者是否進行防禦性的無檢查如果它不是零,dealloc和release/nil?

+3

你知道你可以發送零發佈消息沒有問題,對吧? nil簡單地忽略發送給它的所有消息並返回nil,因爲它的值沒有錯誤。無需像NULL這樣的無防禦性檢查 – 2010-05-16 15:52:39

回答

8

在兩者中釋放它。你不需要檢查零。零放行什麼都不做。

但是,viewDidUnload不會發布在viewDidLoad中無法輕鬆重新創建的ivars,以防視圖重新加載。

通常(無內存警告)viewDidUnload不會被調用,只調用dealloc。

+0

爲了保持良好的衛生習慣,是否應該在dealloc中完成一個零設置? – alyssackwan 2010-05-16 16:07:22

+0

爲了安全是的,但我只能想到幾個重要的案例。我喜歡使用setter將它設置爲nil,因爲它將它釋放並將它設置爲零(即:self.ivar = nil;) – progrmr 2010-05-16 17:28:47

+6

真的沒有理由在'dealloc'中將ivars設置爲'nil'。另外,它違背了Apple在dealloc中使用setter的建議(即'self.ivar = nil'),因爲在部分解除分配的對象中使用setter可能會有問題。使用setter可能不是問題,但爲了100%安全,您可以使用'[ivar release]'代替。 – shosti 2010-05-16 20:16:15

相關問題