如果我有一個保留計數爲1的NSMutableArray,並且此數組有多個具有保留計數大於1的變量的A類對象,那麼如果我釋放數組,這個變量會發生什麼?他們是否被迫釋放每一個保留的數量和釋放空間,否則他們會佔用內存?如果我釋放NSMutableArray被釋放,如果它們的retainCount大於1,數組中的對象會發生什麼?
回答
釋放數組與刪除數組中的所有項目具有相同的效果。也就是說,數組不再聲明它們的所有權。如果其他人保留了這些對象,它們將繼續存在。如果沒有,他們將被釋放。
這只是一組正常的內存規則。如果你保留一個對象,你必須釋放它。相反,其他一些代碼(如數組)也可以保留並釋放該對象,但如果每個人都遵守規則,則沒有人會感到驚訝。
將retain
調用看作+1,將release
調用看作-1。您的通話釋放NSArray
釋放NSArray
,然後這反過來將發送release
到其持有的每一個項目,但由於NSArray
對他們採取了retain
,當你加入他們來說,這只是平衡其retain
/release
電話。
通常最好集中更多的精力來平衡你的retain
和release
調用,而不是想象在任何特定時間保留的次數。
自從retainCount == 0以後,您發送該版本時,您的數組將被釋放。當程序解除分配集合類型對象(如數組)時,它將對集合中的所有對象執行釋放。所有發佈都會減少保留計數。直到retainCount == 0纔會發生取消分配。因此,如果數組中的對象具有retainCount == 2,那麼在數組解除分配後,它們將具有retainCount == 1。如果沒有其他變量引用這些對象中的任何一個,那麼它們將繼續作爲內存泄漏而存在。
當數組_deallocated_時,數組只會對其所有項目執行'release',而不是像第一句所說的那樣簡單地釋放它。此外,當您在最後一句中說「擁有」時,我認爲您的意思是「有一個參考」,即指向,因爲保留計數本身代表所有權。 –
謝謝,注意到並且合併。 – pokstad
嚴格來說,當retainCount
爲1並釋放數組時,數組將被「釋放」。在數組解除分配之前,數組將向該數組中的每個元素髮送release
消息。我想你可以想象其餘的。
- 1. 如果您嘗試釋放已釋放的對象,會發生什麼情況?
- 2. 我釋放一個釋放對象後會發生什麼?
- 3. 如果我釋放對象,釋放對象所屬的池後會發生什麼情況?
- 4. 如果調用對象被釋放,調度線程會發生什麼?
- 5. 我只釋放對象,如果我使用alloc創建它們?
- 6. 如果我們不能釋放它,malloc的行爲是什麼
- 7. 爲什麼我釋放我的對象後仍然得到retainCount = 1
- 8. 我們何時應該釋放一個對象,如果我們返回它?
- 9. 當包含這些對象的NSMutableArray被釋放時,如何釋放組合對象?
- 10. 對象分配和它們的釋放
- 11. 這個對象爲什麼被釋放?
- 12. 對象被釋放 - 爲什麼?哪裏?
- 13. 如何從數組中釋放對象?
- 14. 如果我忘記在iPhone應用程序中釋放對象會發生什麼?
- 15. 如果我忘記釋放C++中的內存會怎麼樣
- 16. 對象與NSMutableArray裏的對象 - 對象如何釋放
- 17. 將-replaceObjectAtIndex:withObject:of NSMutableArray釋放被新對象替換的舊對象嗎?
- 18. 如果這個條件成立,對象如何被釋放?
- 19. 在.NET中發生了什麼事如果發生在釋放方法(〜法)
- 20. jni-釋放對象數組
- 21. UIAcivityIndicatorView是否自行停止動畫,如果它被移除/釋放/釋放
- 22. 如果我從構造函數中拋出異常,構造函數中的釋放內存會發生什麼?
- 23. 什麼時候釋放了一個自動釋放的對象?
- 24. 如果我們忽略新對象的結果會發生什麼?
- 25. iPhone - 蘋果崩潰釋放NSMutableArray
- 26. 爲什麼retainCount在釋放被調用後返回值?
- 27. 狀態,如果內存被釋放
- 28. 釋放NSFileManager,如果它永遠不會到達發佈消息
- 29. 如果我刪除@EJB註釋會發生什麼?
- 30. 釋放NSMutableArray?
對象不會被釋放,直到它們的保留計數爲零。他的問題是數組中的對象的保留數大於1(例如,retainCount = 2)。當數組被釋放時,數組中的對象將減少其所有保留計數(例如,retainCount = 1),如果沒有其他對象擁有對它們的所有權(因爲retainCount> 0),它們將是內存泄漏。 – pokstad