2010-03-17 62 views
1

我需要幫助取消分配自定義對象的NSMutableArray。我需要保留數組,因此我在.h中添加了一個屬性,然後在.m文件中的dealloc中釋放它。當我添加對象數組,我做到以下幾點:取消分配自定義對象的NSMutableArray

myarray = [[NSMutableArray alloc] init]; 
    [myarray addObject:[[mycustomObject alloc]initWithObject:obj1]]; 
    [myarray addObject:[[mycustomObject alloc]initWithObject:obj2]]; 

現在,我不知道如何釋放mycustomobject。如果我執行以下操作:

[myarray addObject:[[[mycustomObject alloc]initWithObject:obj1] autorelease]]; 

我在稍後訪問陣列時遇到問題。請指教。

+0

我在最後一行的末尾添加了缺失的括號。這種方法是完全正確的,所以你必須做些奇怪的事情。如果可變數組是自動釋放的,則預計在某個時刻它將被釋放,並嘗試使用它將導致崩潰。 –

回答

5

我不認爲你瞭解可可的內存管理是如何工作的。該數組將保留添加到它的對象,並且當數組不再需要時(例如釋放數組時)它將自行釋放它們。

換句話說,將自動釋放對象添加到數組中,之後不用擔心它的保留數。如果你想從陣列中刪除它,只需將其刪除(使用removeObjectAtIndex:或類似的東西)。如果你認爲你想釋放對象而不從數組中移除它,那麼你做錯了什麼,因爲這可能會在你的數組中留下一個懸掛指針,這會讓你稍後崩潰。

你真的應該真的再次檢查documentation,特別是Object Ownership and Disposal的部分。

3

正確的方式做,這是爲了讓陣列保持自定義對象的所有權:

NSMutableArray * array = [[NSMutabelArray alloc] init]; 

for (id obj in anArrayOfObjects) { 
    mycustomObject * customObj = [[mycustomObject alloc] initWithObject:obj]; 
    [array addObject:customObj]; 
    [customObj release]; 
} 

如果您在以後訪問您的陣列,那麼你做錯事與記憶困難數組的管理。

+0

好的,這是尷尬。 [myarray addObject:[[[mycustomObject alloc] initWithObject:obj1] autorelease];實際上按預期工作。我記得在開始時看到它的問題,可能是一個不同的故障。謝謝所有的重申! – Dave

+0

@Dave你的答案當然是正確的,但他的方法(使用autorelease)也是正確的,並且更短。我理解避免自動釋放的意圖,但它很快就能解決,而且開銷很小,通常更簡單。特別是當數組中的對象將會出現一段時間時,我們不僅僅創建很多瞬態臨時對象。即使如此,一個正確和有用的答案應該得到upvote ...... ;-) –

+1

@Quinn @Dave - 是的,將它包裝在'autorelease'中可以工作得很好(因爲你放棄所有權)並且完全可以接受。避免深度嵌套方法調用是我個人的偏好。國際海事組織,將其分解到不同的線路上,使其更具可讀性和清晰度。 –

相關問題