2011-05-24 46 views
1

如果我有一個輔助方法,這就是增加了對象在我的自定義類的數組(NSMutableArray的),會是有意義的做之一:如果一個方法接受對象並添加到一個數組中,它是否應該在必要時檢測並釋放對象?

  1. 莫名其妙地自動檢測是否進入的對象已經被自動釋放?那麼如果在將其添加到數組後將其釋放?
  2. 在dealloc中迭代數組中的所有對象,並以某種方式檢查它們是否不需要被釋放,然後在釋放數組本身之後呢?

我所關心的是當我不得不釋放我的自定義類,包括數組時,我怎麼知道數組中的對象的狀態?

+0

它不應該需要知道。事實上,你的班級並不重要。如果調用代碼將對象標記爲自動釋放,則它不擁有自己的指針。如果它保留了對象,它擁有這些對象。你自己的幫手不需要知道這一點。 – BoltClock 2011-05-24 23:33:48

回答

4

它應該是代碼調用你的幫助器方法釋放對象(通過autorelease或正常版本)後,將它們傳遞給你的函數的責任。傳遞給你的對象將被保存下來供你使用,方法是將它們放入數組中。當你在dealloc中釋放數組時,該數組中的所有對象都將被釋放。合理?

I.e.你不需要做任何特別的事情 - 只需將對象添加到你的數組中。

+0

是的 - 所以只需在dealloc方法中發佈[_myArray發佈]就是我所要做的然後對嗎? – Greg 2011-05-24 23:54:07

+0

這是正確的... – nielsbot 2011-05-25 06:50:38

2

在處理其他對象內存的方法(除訪問器方法外)中,您不會執行任何操作。這是對象所有權的整體概念;因爲你的方法不擁有你傳入的對象,它不應該處理該對象的內存。 NSMutableArray將處理它在交易時包含的對象,除了在完成數組時釋放數組之外,您無需執行任何其他工作。

3

最簡單的規則 - 不時被提及 - 是你應該只釋放已明確分配(alloc),複製(copy),新建(new)或保留的對象(保留)。在你描述的場景中,你對任何事情都不負責任。如果你的方法沒有做上述四件事中的任何一件,那麼沒有什麼可擔心的。

+0

這是內存管理的最大規則101 – 2011-05-24 23:41:48

0

莫名其妙地自動檢測傳入的對象是否已經autoreleased?那麼如果在將其添加到數組後將其釋放?

沒有 - 集保留他們添加的對象,然後當他們在dealloc的迭代去除

釋放他們通過陣列中的所有對象,並以某種方式檢查他們並不需要被釋放,並那麼在發佈這個數組之後呢?

沒有 - 集保留他們添加的對象,然後釋放他們時,他們被刪除

關注我的是,當我要的dealloc我的自定義類,包括陣列,我怎麼知道數組中對象的狀態?

集合將負責處理它,並在集合中保存對象的引用。 (當然)負責在陣列本身上調用release時,持有它的對象將刪除或替換它(例如,在dealloc中)。

相關問題