2011-04-15 56 views
0

我有一個顯示儀器泄漏的代碼。它顯示了泄漏,我初始化arrayDetPerformancearrayDetail內存泄漏:在iPhone應用程序中釋放NSArray的問題

的內容,如果我鬆開我的arrayDetail那麼我的應用程序崩潰。

什麼可能是錯的?

下面是代碼:

NSDictionary *finalResult = [extractUsers JSONValue]; 
    //  NSLog(@" Stamp-16 : %@",[NSDate date]); 
    NSLog(@"Array2 : %d",[arrayDetail retainCount]);  //RETAIN COUNT IS 0 
    arrayDetail = [[finalResult objectForKey:@"Detail"] 
    NSLog(@"Array2 : %d",[arrayDetail retainCount]);  //RETAIN COUNT IS 2 

    // NSLog(@"Data is : %@",array1); 
    //  NSLog(@" Stamp-17 : %@",[NSDate date]); 

    //NSLog(@"Final Value is : %@",[[allUsers objectAtIndex:0] valueForKey:@"password"]); 

    //[self setUserData:allUsers]; 
    //[tblView reloadData]; 

    [responseString release]; 
    [request release]; 

} 



//sleep(0.3); 
//[inProgressIndicator stopAnimating]; 
[fileContents release]; 

//Release all the allocated data 
[json release]; 
//label.text = @"Finish"; 
// NSLog(@" Stamp-19 : %@",[NSDate date]); 
NSUserDefaults *def = [NSUserDefaults standardUserDefaults]; 
//NSLog(@"Array2 : %d",[array2 retainCount]); 

arrayDetPerformance = [[NSMutableArray alloc] initWithArray:arrayDetail]; 
chartPoints= [arrayDetPerformance valueForKey:@"Points"]; 
NSLog(@"Chart Points: %@",chartPoints); 
[def setObject:chartPoints forKey:@"yarray"]; 
[def setObject:@"YES" forKey:@"flagThumb"]; 

//array1 = [[NSMutableArray alloc] initWithObjects:@"New",@"Table",@"View",nil]; 
//[self.Dettable reloadData]; 
//sNSFileManager *fileManager = [NSFileManager defaultManager]; 
//[array2 release]; 
NSLog(@"ArrayDEtPerfomance : %d",[arrayDetPerformance retainCount]); 
NSLog(@"array2 : %d",[arrayDetail retainCount]); 
if([chartPoints count]>0) 
{ 
    PlotItem *plotItem = [[PlotGallery sharedPlotGallery] objectAtIndex:0]; 
    [plotItem imageHive:Fund]; 
} 

//[arrayDetail release]; 

} 

內存泄漏是在

arrayDetPerformance = [[NSMutableArray alloc] initWithArray:arrayDetail]; 

另外我對爲什麼從0直接轉到2在下面的代碼保留計數困惑線圖所示:

NSLog(@"Array2 : %d",[arrayDetail retainCount]);  //RETAIN COUNT IS 0 
    arrayDetail = [[finalResult objectForKey:@"Detail"] 
NSLog(@"Array2 : %d",[arrayDetail retainCount]);  //RETAIN COUNT IS 2 

什麼可能是錯的?

+0

如何聲明'arrayDetPerformance'?這是一個財產嗎? – 2011-04-15 10:45:04

+1

方面評論:AFAIK你不應該在運行時依賴[yourObj retainCount]值...保留計數只能在樂器中有用。 – matm 2011-04-15 10:48:49

+0

@Nick Weaver:是的,它是一個帶有屬性(非原子,保留)的NSMutableArray並被合成。什麼可能是錯的? – 2011-04-15 11:04:50

回答

2

它顯示泄漏,因爲您分配arrayDetPerformance然後不釋放它。就那麼簡單。至少這是我們可以從您向我們展示的代碼中看出的。

至於其餘的,請不要使用retainCount來調試內存問題!你必須瞭解簡單的memory management rules並遵循它們,沒有別的。由於您不知道Apple的底層代碼的功能,因此您無法依賴對象的保留計數。

至於你關於這個代碼的問題:

NSLog(@"Array2 : %d",[arrayDetail retainCount]);  //RETAIN COUNT IS 0 
arrayDetail = [[finalResult objectForKey:@"Detail"] 
NSLog(@"Array2 : %d",[arrayDetail retainCount]);  //RETAIN COUNT IS 2 

您分配一個整體的其他對象arrayDetail所以這是完全沒有意義的前和轉讓後,中arrayDetail任何性質比較。保留數可能會遍佈整個地方,它不會告訴你任何事情。

我覺得你並不真正瞭解你在這裏做什麼。你應該反覆閱讀內存管理規則,直到你徹底理解它們。

+0

arrayDetPerformance在dealloc方法中解除分配。 – 2011-04-15 10:59:23

+1

@PARTH:所以也許當dealloc被調用並試圖釋放arrayDetPerformance之前,你甚至使用它,所以它從來沒有初始化/分配? – matm 2011-04-15 11:05:23

1

retainCount不會幫助你調試你的問題(事實上它幾乎從不與調試有關,所以最好忘記它甚至在那裏)。

不要釋放arrayDetail,因爲您不擁有它。問題出在arrayDetPerformance。您正在爲該線路分配一個對象,並且它不會在任何地方發佈。現在,您可能正在代碼中的其他位置執行此操作,但如果您沒有完成該操作,請在完成使用後發送release

編輯

如果你重新分配在dealloc方法arrayDetPerformance,我假設它是一個實例變量?在這種情況下,你不能假定它沒有指向一個對象,所以你應該在將它分配給新對象之前發送一個release

或者,如果它被配置爲一個屬性,只需使用self.arrayDetPerformance = ...這將負責你的內存管理。

+0

我已經在我的dealloc方法中釋放了我的arrayDetPerformance,那麼還有什麼可能是錯誤的? – 2011-04-15 11:02:27

-1

[arrayDetPerformance release];沒有寫在你的代碼中;

因此,它顯示內存泄漏。

1

不要叫retainCount

retainCount是沒用的。對象的絕對保留數是一個實現細節。規則很簡單;如果你保留了某些東西,你必須在完成後釋放它。故事結局。

memory management documentation對此進行了充分討論。


首先,retainCount可以永遠不會返回零。唯一一次你會得到一個零是如果你碰巧消息nil。這:

NSLog(@"Array2 : %d",[arrayDetail retainCount]);  //RETAIN COUNT IS 0 
arrayDetail = [[finalResult objectForKey:@"Detail"] 
NSLog(@"Array2 : %d",[arrayDetail retainCount]);  //RETAIN COUNT IS 2 

您正在導致arrayDetail指向該第二行上的另一個對象。因此,該行之前/之後的保留計數之間沒有關係。

當泄漏告訴你的泄漏是在這樣一個特定的行...

arrayDetPerformance = [[NSMutableArray alloc] initWithArray:arrayDetail]; 

...這是告訴你,說分配對象上的線被泄露。這是不是告訴你,特定的行是泄漏的原因。泄漏很可能是因爲您在其他地方過度保留或忘記泄漏它。

你在幾條評論中說過你「正在釋放你的dealloc中的某些東西」。顯示你的dealloc方法的實現。

+0

我幾乎搜索了你的另一個答案來剪切和粘貼第一段! :) – paulbailey 2011-04-15 16:35:02