2011-03-15 243 views
3

有人能請指教爲什麼我在這段代碼中有內存泄漏?內存泄漏問題

我在代碼中添加了分析器中的註釋。如果有人能夠幫助我並解釋爲什麼我會收到這兩條評論,我將不勝感激。

- (void)viewDidDisappear:(BOOL)animated { 

// Empty array to be sure it is empty 
[playerArray removeAllObjects]; 

//============CLEAN OUT DOUBLE NAMES FROM ARRAY==============// 
NSArray *sortedDummyArray = [[NSArray alloc] initWithArray:selectedPlayersArray]; 
    ////>>>>The line above is line 84<<<<<<<//// 

// Sort the array 
sortedDummyArray = [sortedDummyArray sortedArrayUsingSelector:@selector(compare:)]; 

NSMutableArray *finalArray = [[NSMutableArray alloc]initWithArray:sortedDummyArray]; 
    ////>>>>>> Possible memory leak on line 84 <<<<<<<<//// 



int xx = [sortedDummyArray count]; 
int yy; 
int counter = 0; 
int rr = 0; 

for (int oo = 0; oo < xx; oo++) { 
    yy = [finalArray count]; 

    for (int zz = 0; zz < yy; zz++) { 

     // If hit, clean out the double name 
     if ([[sortedDummyArray objectAtIndex:oo] isEqualToString:[finalArray objectAtIndex:rr]]) { 

      counter++; 

      // Check if there is more than one of this name 
      if (counter > 1) { 
       [finalArray removeObjectAtIndex:rr]; 
       rr--; 
       counter--; 
      } 
     } 
     rr++; 
    } 
    counter = 0; 
    rr = 0; 
} 

[sortedDummyArray retain]; 

// Save who is in the game 

AccessQuestionsDB *shufflePlayersFunction = [AccessQuestionsDB new]; 
finalArray = [shufflePlayersFunction shufflePlayers: finalArray]; 
[shufflePlayersFunction release]; 

TempPlayersInTheGame *savePlayersInTheGame = [TempPlayersInTheGame new]; 
[savePlayersInTheGame saveSelectedPlayers:finalArray]; 
[savePlayersInTheGame release]; 

[finalArray release]; //>>>> see comment below 
    ////>>>>>Incorrect decrement of the reference count of an object that is not owned at this point by the caller <<<<<<///// 

    [sortedDummyArray release]; 
[super viewDidDisappear:animated]; 

}

回答

3

第一泄漏,因爲你打電話的原因造成的:

[sortedDummyArray retain]; 

您已經呼籲其做到這一點的頁頭,但只在最後一次釋放它(所以刪除以上線)您也然後重新分配它是不正確的。

你的第二次泄漏是因爲你用alloc設置了finalArray,然後用函數的結果替換它。

NSMutableArray *finalArray = [[NSMutableArray alloc]initWithArray:sortedDummyArray]; 

有了這一個:

NSMutableArray *finalArray = [NSMutableArray arrayWithArray:sortedDummyArray]; 

然後刪除這一行:您可以通過更換此行解決這個

[finalArray release]; 

這麼幹脆你函數看起來像這樣:

- (void)viewDidDisappear:(BOOL)animated { 

    // Empty array to be sure it is empty 
    [playerArray removeAllObjects]; 

    //============CLEAN OUT DOUBLE NAMES FROM ARRAY==============// 
    // Sort the array 
    NSArray *sortedDummyArray = [selectedPlayersArray sortedArrayUsingSelector:@selector(compare:)]; 

    NSMutableArray *finalArray = [NSMutableArray arrayWithArray:sortedDummyArray];  

    int xx = [sortedDummyArray count]; 
    int yy; 
    int counter = 0; 
    int rr = 0; 

    for (int oo = 0; oo < xx; oo++) { 
     yy = [finalArray count]; 

     for (int zz = 0; zz < yy; zz++) { 

      // If hit, clean out the double name 
      if ([[sortedDummyArray objectAtIndex:oo] isEqualToString:[finalArray objectAtIndex:rr]]) { 

       counter++; 

       // Check if there is more than one of this name 
       if (counter > 1) { 
        [finalArray removeObjectAtIndex:rr]; 
        rr--; 
        counter--; 
       } 
      } 
      rr++; 
     } 
     counter = 0; 
     rr = 0; 
    } 

    // Save who is in the game 

    AccessQuestionsDB *shufflePlayersFunction = [AccessQuestionsDB new]; 
    finalArray = [shufflePlayersFunction shufflePlayers: finalArray]; 
    [shufflePlayersFunction release]; 

    TempPlayersInTheGame *savePlayersInTheGame = [TempPlayersInTheGame new]; 
    [savePlayersInTheGame saveSelectedPlayers:finalArray]; 
    [savePlayersInTheGame release]; 

    [super viewDidDisappear:animated]; 
} 

但所有這一切是矯枉過正只是刪除重複的條目,您的數組轉換爲NSSet中(這始終是唯一的),然後將其轉換回一個NSArray應該照顧這對你,所以你的功能應該是

- (void)viewDidDisappear:(BOOL)animated { 

    // Empty array to be sure it is empty 
    [playerArray removeAllObjects]; 

    //============CLEAN OUT DOUBLE NAMES FROM ARRAY==============// 
    NSSet *uniquePlayers = [NSSet setWithArray:selectedPlayersArray]; 

    // Save who is in the game 

    AccessQuestionsDB *shufflePlayersFunction = [AccessQuestionsDB new]; 
    NSArray *finalArray = [shufflePlayersFunction shufflePlayers: [uniquePlayers allObjects]]; 
    [shufflePlayersFunction release]; 

    TempPlayersInTheGame *savePlayersInTheGame = [TempPlayersInTheGame new]; 
    [savePlayersInTheGame saveSelectedPlayers:finalArray]; 
    [savePlayersInTheGame release]; 

    [super viewDidDisappear:animated]; 
} 
+0

我仍然會避免在不同的時間使用相同的指針指向2個不同的數組。而不是在接近尾聲時重新設置finalArray;我會有一個完全不同的指針用於savePlayersInTheGame。只是爲了保持簡單。 – GendoIkari 2011-03-15 21:03:47

+0

A BIG謝謝你,這個論壇對待像我這樣的新人真的很棒:-) – PeterK 2011-03-15 21:09:37

+2

@Gendolkari我同意,我清理了內存泄漏以幫助說明是什麼導致了他們。但對於這個特殊的問題(刪除重複的名稱),我發佈了一個更簡單的解決方案,它可以消除所有的泄漏和指針重用。 – theChrisKent 2011-03-15 21:15:00

1

是保留dummySortedArray所需的電話嗎?我想你可能已經在其上的保留計數,當你initalise集合

的NSArray * sortedDummyArray = [[NSArray的 頁頭] initWithArray:selectedPlayersArray]。

1

你的問題是這樣的一行:

finalArray = [shufflePlayersFunction shufflePlayers: finalArray]; 

此前,您正在內存中創建一個新數組,並告訴finalArray指向它。但是這條線告訴FinalArray指向不同的東西。所以現在,你創建的原始數組仍然在內存中,再加上你發佈了一個不同的數組。

你也用sortedDummyArray做同樣的事情。如果你分配一個對象,那麼不要再把指針設置爲指向別的東西。