2011-07-15 101 views
1

因此當我嘗試運行下面的代碼時,我最終得到了一個EXC_BAD_ACCESS錯誤。它發生在我嘗試釋放一個NSMutableArray retrieveAnalysisDataList。該數組是retrieveAnalysisData對象的列表。如果我嘗試釋放數據列表,或者如果我使用autorelease設置init,我會得到相同的結果。我有點猜測它與代碼的排序部分有關,因爲我沒有retrieveAnalysisIDarray這個問題。釋放一個NSMutableArray導致EXC_BAD_ACCESS錯誤

有什麼想法?

if (tempDict != NULL) 
    { 
     NSMutableArray *retrievedAnalysisDataList = [[NSMutableArray alloc] init]; 
     NSMutableArray *retrievedAnalysisIDarray = [[NSMutableArray alloc] init]; 

     for (id key in tempDict) 
     { 
      retrievedAnalysisData = [[RetrievedAnalysisData alloc] init]; 

      retrievedAnalysisData.createDate = [[tempDict objectForKey:key] objectForKey:@"createdate"]; 
      retrievedAnalysisData.ID = [[tempDict objectForKey:key] objectForKey:@"id"]; 
      retrievedAnalysisData.mode = [[tempDict objectForKey:key] objectForKey:@"mode"]; 
      retrievedAnalysisData.name = [[tempDict objectForKey:key] objectForKey:@"name"]; 
      retrievedAnalysisData.numZones = [[tempDict objectForKey:key] objectForKey:@"numzones"]; 
      retrievedAnalysisData.srcImg = [[tempDict objectForKey:key] objectForKey:@"srcimg"]; 
      retrievedAnalysisData.type = [[tempDict objectForKey:key] objectForKey:@"type"]; 

      //NSLog(@"\n createDate: %@ \n id: %@ \n mode: %@ \n name: %@ \n numzone: %@ \n srcimg: %@ \n type: %@", retrievedAnalysisData.createDate, retrievedAnalysisData.ID, retrievedAnalysisData.mode, retrievedAnalysisData.name, retrievedAnalysisData.numZones, retrievedAnalysisData.srcImg, retrievedAnalysisData.type); 

      [retrievedAnalysisDataList addObject:retrievedAnalysisData]; 
      [retrievedAnalysisData release]; 
     } 

     NSSortDescriptor *sortDescriptor; 
     sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"createDate" ascending:YES] autorelease]; 
     NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 
     NSArray *sortedRetrievedAnalysisDataList; 
     sortedRetrievedAnalysisDataList = [retrievedAnalysisDataList sortedArrayUsingDescriptors:sortDescriptors]; 

     int count = [sortedRetrievedAnalysisDataList count]; 

     for (int i = 0; i < count; i++) { 
      retrievedAnalysisData = [[RetrievedAnalysisData alloc] init]; 
      retrievedAnalysisData = [sortedRetrievedAnalysisDataList objectAtIndex:i]; 

      [retrievedAnalysisIDarray addObject:retrievedAnalysisData.ID]; 
      [retrievedAnalysisData release]; 
     } 

     dataCenter.sortedRetrievedAnalysisDataList = sortedRetrievedAnalysisDataList; 
     dataCenter.retrievedAnalysisIDarray = retrievedAnalysisIDarray; 

     [retrievedAnalysisIDarray release]; 
     [retrievedAnalysisDataList release]; 

     dataCenter.isRetrieve = [NSNumber numberWithInt:1]; 

     [activityIndicator stopAnimating]; 
     [picker reloadAllComponents]; 

     picker.hidden = FALSE; 
     pickerToolBar.hidden = FALSE; 
     toolBar.hidden = TRUE; 
     innerCircle.hidden = TRUE; 
     outerCircle.hidden = TRUE; 
     trackLabel.hidden = TRUE; 
     displayGPSLabel.hidden = TRUE; 

    } 

回答

4

你的問題在於這部分代碼:

 retrievedAnalysisData = [[RetrievedAnalysisData alloc] init]; 
     retrievedAnalysisData = [sortedRetrievedAnalysisDataList objectAtIndex:i]; 

     [retrievedAnalysisIDarray addObject:retrievedAnalysisData.ID]; 
     [retrievedAnalysisData release]; 

第一行分配一個新RetrievedAnalysisData,但隨後的第二拋出遠(泄漏的話),並把對象取出從數組代替retrievedAnalysisData變量。您不擁有從數組中獲取的此對象,並且您不通過調用retain獲取所有權。所以第四行的release是不正確的,釋放一個你不擁有的對象。

然後,當你釋放你的NSMutableArray時,它會嘗試再次釋放該對象,並且因爲該對象已經釋放而發生崩潰。

要解決它,擺脫無用的第一行,並擺脫不正確的釋放。

+0

好的,改變了代碼,它的工作。進行分析併發布數據列表,泄漏消失了!非常感謝你,這是我在代碼中的幾個地方遇到的問題,所以我非常感激。我對obj-c和學習還很陌生,剛開始使用自定義對象。 你能否進一步解釋原代碼中會發生什麼?我創建了一個新的RetrievedAnalysisData對象,但是當我嘗試從我的sortedRetrievedAnalysisDataList中爲它分配一個RetrievedAnalaysisData對象時,我該如何將它扔掉? – Log139

1

不知道你的所有屬性的內存管理,很難看到究竟發生了什麼。但這裏看看:

for (int i = 0; i < count; i++) { 
     retrievedAnalysisData = [[RetrievedAnalysisData alloc] init]; 
     retrievedAnalysisData = [sortedRetrievedAnalysisDataList objectAtIndex:i]; 

     [retrievedAnalysisIDarray addObject:retrievedAnalysisData.ID]; 
     [retrievedAnalysisData release]; 
    } 

您一個自動釋放的對象(retrievedAnalysisData)上調用-release。試試這個:

for (int i = 0; i < count; i++) { 
     retrievedAnalysisData = [sortedRetrievedAnalysisDataList objectAtIndex:i]; 

     [retrievedAnalysisIDarray addObject:retrievedAnalysisData.ID]; 
    }