2011-08-14 197 views
0

可能重複:
Objective C Memory Management內存泄漏 - 目標C

我的代碼是在這裏展示了內存泄漏:

NSMutableArray* newImageArray = [[NSMutableArray alloc] init]; 
NSMutableArray* newMediaArray = [[NSMutableArray alloc] init]; 

if (self.categoryIndex == 0) { 
    for (int i=1; i < [categoryArray count]; i++) 
    { 
     newImageArray = [NSMutableArray arrayWithArray:[newImageArray arrayByAddingObjectsFromArray:[self getImageArrayByCategoryIndex:i]]]; 
    } 
} 
else { 
    newImageArray = [self getImageArrayByCategoryIndex:self.categoryIndex]; 
} 

for (int i=0; i < [newImageArray count]; i++) 
{ 
    Media* media = [[Media alloc] init]; 
    NSString* imageFile = [newImageArray objectAtIndex: i]; 

    media.imageFile = [UIImage imageNamed:imageFile]; 
    media.imageLabel = [[imageFile lastPathComponent] stringByDeletingPathExtension]; 
    media.soundFile = [appFolderPath stringByAppendingString:[[[imageFile stringByDeletingPathExtension] stringByAppendingString: @".wav"] stringByReplacingOccurrencesOfString: IMAGES_FOLDER withString: SOUNDS_FOLDER]]; 

    [newMediaArray addObject:media]; 
} 

self.mediaArray = newMediaArray; 

[self setNextMediaIndex]; 

我不釋放媒體,因爲它是被newMediaArray使用(由mediaArray使用,它用於我的主要對象)。當我釋放我的主要對象時,是不是應該釋放所有東西?

+1

歡迎StackOverflow上。爲什麼不選擇用戶名並讓自己舒服?此外,只需將此代碼發佈爲另一個問題的編輯。 – Moshe

+0

在'if'分支中,你不是將對象添加到原始'newImageArray'中,而是在'for'循環的每次迭代中完全用另一個數組替換它,從而泄漏原始數組(其他的是自動釋放的)。你可能想要'[newImageArray addObjectsFromArray:...];'。自從您分配一個不同的數組後,'else'分支也會泄漏原始數組。在第二個'for'中,你在每次迭代中泄漏'Media'對象。在'self.mediaArray = newMediaArray;'之後''你也不會釋放'newMediaArray'。 – albertamg

回答

1

看起來你正在泄漏所有的地方以各種方式

newImageArray被分配但永遠不會釋放,additionaly要覆蓋,你在你的代碼與其他版本的第一行分配的版本。所以即使你在這個代碼段的末尾發佈了它,錯誤的版本也會被釋放。看起來你甚至不需要分配這個。

newMediaArray被分配但永遠不會釋放,你呢,分配給屬性mediaArray如果您使用@synthesize創建該屬性的代碼,這取決於你如何宣稱財產,二傳手將retain值即newMediaArray形成防漏。

media獲得分配但從未釋放,它將被添加到NSMutableArray這意味着它將被數組保留。如果您的應用程序崩潰時在釋放media for循環的問題是其他地方

Memory Management Programming Guide幾乎是一本必讀書

0

當一個NSMutableArray(如newMediaArray)添加一個對象時,它將保留該對象。您不需要(也不應該)代表陣列保留該對象。這基本上是Objective-C中內存管理的工作原理:每個對象保留它引用的內容,並在完成時釋放它們。 newMediaArray是它自己的對象,所以它會管理它自己的引用。

您應該在您的for循環的主體末尾附近釋放media,因爲您已完成使用該對象的工作。如果你沒有發佈它,那麼你會失去對它的參考,並且將來你將無法發佈它。

0

你做

[newMediaArray addObject:media]; 

這意味着newMediaArray做對media一個retain。然後你可以發佈media(你的應該)。只要數組引用它,數組方法中的retain將保持活動狀態。如果你沒有在你的方法中釋放它,保留計數將保持2,即使數組釋放它,它仍然是1,不會被解除分配。

你可以這樣做:

Media *media = [[[Media alloc] init] autorelease]; 

然後自動釋放池會釋放它的時候,而不是這種方法之前結束。

0

您需要在循環底部有[media release]聲明。 newMediaArray也應在分配給mediArray屬性後發佈。