2011-11-28 106 views
0

在我的應用程序中,單例類(SharedData)的NSMutableArray的分配內存:NSMutableArrays - 我可以這樣做嗎?

[self sharedMutableArray] = [[NSMutableArray alloc] init]; 

A類填充這個sharedMutableArray:

NSObject *obj = [NSObject alloc] init]; 
[sharedMutableArray addObject]; 
obj = nil; 

B類做到這一點 - 這是我的問題:

NSMutableArray *tmpArray = sharedMutableArray; 
     ... uses the tmpArray locally 
[tmpArray removeAllObjects]; 
tmpArray = nil; 

這是一種遺傳代碼和我的預感是,這是一個沒有沒有。有人可以證實,將nil分配給tmpArray也會釋放sharedMutableArray的內存......我猜想作者只想釋放tmpArray ...

+2

正如其他人說,設置一個指向零隻設置指針爲零。指針不是它指向的對象,不僅僅是你在明信片上的地址就是你的房子。銷燬明信片不會破壞房子。 –

回答

1

將tmpArray指定爲nil僅將您的指針設置爲nil。它不會影響對象本身(或其生命週期)。在這種情況下,你所創建的對象設置爲nil什麼都不做,因爲他們的變量聲明是在局部範圍內 - 如果你想從內存中釋放的對象,你需要的指針設置到對象之前,release送他們到nil

然而,發送​​影響你原來的sharedArray,因爲你沒有數組複製,你只需設置一個新的指針指向了「單身」。你可能希望這樣的:

NSMutableArray *tmpArray = [NSMutableArray arrayWithArray:sharedMutableArray]; 

你並不需要在上述情況下使用​​,因爲它會被autorelease'd。我建議你閱讀this

+0

感謝您的回覆。我使用ARC,而我不知道我怎麼會去有關複製sharedMutableArray的內容tmpArray - 我應該使用(...)循環? - 像 - for(NSObject * elem in sharedMutableArray){[tmpArray addObject:elem]; } ?? – Sam

+1

ARC使用'arrayWithArray:'沒有問題 - 它爲你完成所有的複製。但是,您似乎完全不瞭解所有權的概念 - 數組只是指向其他對象的指針列表。即使您將指針列表複製到新的指針列表中,這些指針指向的對象也不會改變(即它們不會被複制)。 –

+0

設計是從sharedArray填充localArray,使用它,然後放棄 - 如果 - 離開shareData。其他一些操作將管理sharedData。 – Sam

0

tmpArray是一個指針,它的初始化以指向sharedMutableArray指向同可變數組。出於這個原因,該行:

[tmpArray removeAllObjects]; 

會空出數組,並使用sharedMutableArray人會看到的變化。換句話說,分配

NSMutableArray *tmpArray = sharedMutableArray; 

不會複製數組本身,它只複製指針。您使用該指針發送的任何消息都將轉到共享數組。同樣,分配給nil設置tmpArray指針tmpArray,但不會做任何數組本身。

最後,設置一個變量nil從不釋放內存。一個屬性設置爲零,而另一方面,將釋放一些條件下(例如,當屬性被聲明爲保持其內容)下存儲器。你在這裏設置一個變量,而不是一個屬性,所以數組將不會被釋放。

+0

謝謝 - 良好的外展。如果tmpArray是一個iVar並且有屬性,那麼tmpArray = nil會釋放sharedMutableArray的內存嗎? – Sam

+0

「最後,設置一個變量爲零*從不*釋放內存」< - sans ARC當然(我知道這就是你的意思) –

+0

不,但是'self.tmpArray'會在屬性爲'retain'的情況下。 –