2012-08-14 55 views
2

假設我有一個NSMutableArray *sasquatch,它有一些數組。當您使用數組調用方法removeAllObjects時會發生什麼?

在ARC中,如果我調用[sasquatch removeAllObjects];是否會導致sasquatch數組中的所有數組爲零?這樣sasquatch數組中的對象也被全部刪除,並且處理了一些東西?

因爲我不知道我是否應該這樣做:

for (NSArray *animalPlanetSearchingFor in sasquatch){ 
[animalPlanetSearchingFor removeAllObjects]; 
} 

之前,我打電話[sasquatch removeAllObjects];

+1

你爲什麼不試試看? – Bot 2012-08-14 21:50:13

+0

@Bot我會嘗試吧! – bmende 2012-08-14 22:49:22

回答

4

也不會遞歸空所有陣列 - 刪除時就會遞減的裁判計數。當數組的引用計數爲0時,所有對象都被刪除。他們自己清理。

低,sasquatch的子陣列不會更改 - 有一個例外:如果sasquatch保存對該子陣列的最後一個引用。在這種情況下,元素(sasquatch的子數組)將被釋放。

在ARC中,如果我調用[sasquatch removeAllObjects];這是否會導致sasquatch數組中的所有數組爲零?

那麼,它只是發送release到每個元素改變count(等)。 NSArrays不能容納nil元素 - 這是禁止的。

因此,如果您製作數組的copy - 那麼將添加對子數組的引用,並且您將擴展子數組的生存期,因爲副本現在也保留引用。

這樣,sasquatch數組數組中的對象也都被刪除了,並且處理了一些東西?

如果sasquatch持有最後一個引用,那麼子數組將在此時解除分配。請記住,引用也可能存在於autorelease池中,因此您的銷燬順序未明確定義 - 即使是最簡單的情況。

另一種方式來看待它:一切都在sasquatch及其子陣列(遞歸)將在它的最後一個引用丟失破壞 - 只有每一個元素是最後保持的基準。

總之 - 在任何情況下都不需要撥打removeAllElements進行清理。

+0

所以如果我的引用計數是1,即時通訊非常確定這是因爲我從來沒有增加它,我是好的嗎? – bmende 2012-08-14 21:28:28

+0

有趣.... – bmende 2012-08-14 21:34:55

+5

@Sasquatch你不需要調用'removeAllElements'進行清理。數組解除分配時,所有元素都將被刪除。 – justin 2012-08-14 21:35:18

相關問題