2009-01-19 60 views
24
NSMutableArray *a1 = [[NSMutableArray alloc] init]; 
NSMutableArray *a2 = [NSMutableArray array]; 

TempObj *obj = [[TempObj alloc] init]; //assume this line is repeated for each obj 
[a1 addObject:obj]; 
[a1 addObject:obj2]; 
[a1 addObject:obj3]; 
[a1 addObject:obj4]; 

[obj release]; 
[obj2 release]; 
[obj3 release]; 
[obj4 release]; 

[a1 release]; 

好的,所以a2是一個autorelease obj所以我不必打電話發佈呢?你怎麼知道你什麼時候得到一個autorelease對象?NSMutableArray內存管理

而對於a1,我不必循環遍歷數組並首先釋放每個對象?如果我打電話給[a1 removeAllObjects];是否調用[[a1 objectAtIndex:#] release];

我是否應該在將它們添加到數組之後釋放這些對象?

回答

45

將對象添加到數組時,它會在該對象上調用retain。如果你不釋放指向該對象的指針,它將是一個泄漏。當釋放數組時,它將在其所有的對象上調用release,因爲它以前稱爲retain

至於autorelease vs release,肯定知道的唯一方法(除了可能讀取文檔)是由方法的名稱。我相信一般的規則是,如果你沒有分配對象,那麼你不負責釋放它。

關於對象創建方法,所有的便利方法(array:,arrayWithObjects:arrayWithArray:等)都會返回自動釋放的對象。但是,它們的相應init方法(init:initWithObjects:,initWithArray:等)不會 - 如果您調用它們,則負責在返回的對象上調用release

我似乎還記得關於此主題的其他一些問題 - 您可以嘗試四處搜索以獲得更全面的解釋。

+0

因此,通過所有對象進行循環並釋放1乘1而不是調用數組本身釋放是錯誤的。 – chicken 2009-01-19 01:00:32

+4

這是正確的 - 數組處理所有爲你。 – Andy 2009-01-19 02:30:09

12

將Objective-C內存管理視爲所有權而不是保留髮布方式更容易。將對象添加到數組時,該數組現在是該對象的共同所有者,並負責正確管理內存。當所有者(無論對象包含您發佈的代碼)在對象上調用release時,它將放棄所有權,現在陣列是唯一所有者。

蘋果對Cocoa所有權的工作方式有一個很好的入門知識(包括如何知道何時你負責在對象上調用release):Memory Management Programming Guide For Cocoa。如果你想使用可可,這是必讀。

0

要記住的基本原理是:您必須在每次調用「init」,「retain」或「copy」時調用相應的「release」或「autorelease」調用。這就是你需要知道的全部內容。

在您的示例中,a1調用了「init」,因此您需要在其上放置一個「發佈」。與「obj」同上。你沒有在其他任何地方調用「init」,「retain」或「copy」,所以你不需要在其他任何地方調用「release」或「autorelease」。

0

我不知道無論是IM對錯

NSMutableArray *a1 = [[NSMutableArray alloc] init]; // will be autorelease 
NSMutableArray *a1 = [NSMutableArray alloc]; // will not autorelease 

後您[a1 removeAllObjects];

0

您發佈的OBJ,OBJ 2,OBJ 3,OBJ4只是將它們添加到陣列(最好方式)之後。否則,你必須循環並釋放每個對象(這是愚蠢的方式:我迄今爲止所做的一個)。