2012-03-16 53 views
0

在我的iOS應用程序中,我使用了一個名爲imageMArray的NSMutableArray。我已經設置了其getter和setter屬性並將其實例化。NSMutableArray:調用方法時的內存管理

在viewDidLoad中:

imageMArray=[[NSMutableArray alloc] initWithArray:CategoryImages]; 
imageMArray=[self shuffleOnlyArray:imageMArray]; 

在ShuffleOnlyArray方法:

NSMutableArray *destArray1 = [[NSMutableArray alloc] initWithCapacity: [sourceArray count]] ; 
return destArray1; 

在洗牌法:

imageMArray=[[self shuffleOnlyArray:imageMArray] retain]; 

在Shuffle方法中似乎存在內存泄漏。

我應該釋放imageMArray還是將其設置爲零?如果它應該被釋放,它是否應該被autoreleased?

回答

5
imageMArray=[[NSMutableArray alloc] initWithArray:CategoryImages]; 

明確在上面的語句中,你有一個memoryleak。相反,你可以像下面這樣。

imageMArray = [NSMutableArray arrayWithArray:CategoryImages]; 

在ShuffleOnlyArray方法中,返回自動釋放對象。

NSMutableArray *destArray1 = [[NSMutableArray alloc] initWithCapacity: [sourceArray count]] ; 
return [destArray1 autorelease]; 

但是在得到它之後,保留(取得所有權)數組對象。

imageMArray=[[self shuffleOnlyArray:imageMArray] retain]; 

編輯

shuffle方法,具體操作如下:

NSMutableArray *imageMArray1 = [imageMArray mutableCopy]; 
if(imageMArray) 
{ 
    [imageMArray release]; 
} 
imageMArray=[[self shuffleOnlyArray:imageMArray1] retain]; 
[imageMArray1 release]; 

編輯2: 還有一個解決辦法:

使用洗牌所提到的類別在SO link

無需創建新數組並釋放數組。

+0

真的有必要!你是對的。因爲當我第一次只是autoreleasing destArray.Not保留它導致崩潰。 – 2012-03-16 07:36:34

+0

@Arpit Parekh,這1個答案很好。 – Hemang 2012-03-16 07:37:30

+0

@Adhira:我已經設置了屬性和綜合,然後我也需要寫保留,因爲否則它將包含自動釋放對象... – 2012-03-16 07:40:29

1

1您已在下列行中發生內存泄漏。

imageMArray = [[NSMutableArray alloc] initWithArray:CategoryImages];

imageMArray = [self shuffleOnlyArray:imageMArray]; 

在第一行創建具有保留計數1 一個對象,然後你說你imageMArray指針指向其他對象。您應該釋放第一個對象,因爲您唾棄對第一個對象的引用,並且在更改引用後無法釋放它!

2您不應該使用retain,因爲您的ShuffleOnlyArray方法返回保留的對象。 你的工廠方法應該返回一個autorelease對象,工廠的調用者應該決定是否保留它。

希望我足夠

+0

嘿,但是當我應該釋放數組,因爲方法包含相同的數組 – 2012-03-16 07:34:01

+0

當我改變參考時,我應該在哪裏釋放它。 – 2012-03-16 08:49:38

+0

你可以像Aadhira那樣讓數組自動釋放,或者你只是打電話。 [imageMArray發佈];然後imageMarray = [self shuffleOnlyArray:imageMArray] ;.並且記住,shuffleOnlyArray必須返回auto relsease,並且必須保留爲Aadhira imageMArray = [[self shuffleOnlyArray:imageMArray] retain]; – 2012-03-16 10:54:15