2011-07-11 16 views

回答

6

釋放數組與刪除數組中的所有項目具有相同的效果。也就是說,數組不再聲明它們的所有權。如果其他人保留了這些對象,它們將繼續存在。如果沒有,他們將被釋放。

這只是一組正常的內存規則。如果你保留一個對象,你必須釋放它。相反,其他一些代碼(如數組)也可以保留並釋放該對象,但如果每個人都遵守規則,則沒有人會感到驚訝。

+0

對象不會被釋放,直到它們的保留計數爲零。他的問題是數組中的對象的保留數大於1(例如,retainCount = 2)。當數組被釋放時,數組中的對象將減少其所有保留計數(例如,retainCount = 1),如果沒有其他對象擁有對它們的所有權(因爲retainCount> 0),它們將是內存泄漏。 – pokstad

1

retain調用看作+1,將release調用看作-1。您的通話釋放NSArray釋放NSArray,然後這反過來將發送release到其持有的每一個項目,但由於NSArray對他們採取了retain,當你加入他們來說,這只是平衡其retain/release電話。

通常最好集中更多的精力來平衡你的retainrelease調用,而不是想象在任何特定時間保留的次數。

1

自從retainCount == 0以後,您發送該版本時,您的數組將被釋放。當程序解除分配集合類型對象(如數組)時,它將對集合中的所有對象執行釋放。所有發佈都會減少保留計數。直到retainCount == 0纔會發生取消分配。因此,如果數組中的對象具有retainCount == 2,那麼在數組解除分配後,它們將具有retainCount == 1。如果沒有其他變量引用這些對象中的任何一個,那麼它們將繼續作爲內存泄漏而存在。

+0

當數組_deallocated_時,數組只會對其所有項目執行'release',而不是像第一句所說的那樣簡單地釋放它。此外,當您在最後一句中說「擁有」時,我認爲您的意思是「有一個參考」,即指向,因爲保留計數本身代表所有權。 –

+0

謝謝,注意到並且合併。 – pokstad

0

嚴格來說,當retainCount爲1並釋放數組時,數組將被「釋放」。在數組解除分配之前,數組將向該數組中的每個元素髮送release消息。我想你可以想象其餘的。

相關問題