Problema de memory leaks

¿Alguien podría aconsejar por qué tengo una pérdida de memory en este código?

Agregué el comentario en Analyzer en el código. Agradecería que alguien me ayudara y explicara por qué obtengo estos dos comentarios.

- (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]; 

}

Su primera fuga se debe a que llama:

 [sortedDummyArray retain]; 

Ya has llamado a un alloc que hace esto, pero solo lo sueltas una vez al final (así que elimina la línea anterior) También lo reasignas que es incorrecto.

Su segunda fuga se debe a que ha establecido finalArray con un atributo y luego lo ha reemplazado con los resultados de la function. Puede solucionar esto reemplazando esta línea:

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

Con este:

 NSMutableArray *finalArray = [NSMutableArray arrayWithArray:sortedDummyArray]; 

Y luego eliminando esta línea:

 [finalArray release]; 

Por lo tanto, su function se vería así:

 - (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]; } 

Pero todo esto es una exageración solo para eliminar las inputs duplicadas, convirtiendo su matriz en un NSSet (que siempre es único) y luego convertirlo a un NSArray debería hacerse cargo de esto por usted, por lo que su function debería ser :

 - (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]; } 

¿Se necesita la llamada para retener dummySortedArray? Creo que ya puede tener una count de retención cuando invierta la colección.

NSArray * sortedDummyArray = [[NSArray alloc] initWithArray: selectedPlayersArray];

Su problema es esta línea:

 finalArray = [shufflePlayersFunction shufflePlayers: finalArray]; 

Anteriormente, está creando una nueva matriz en la memory y le dice a finalArray que apunte a ella. Pero esta línea aquí le dice a finalArray que apunta a algo diferente. Así que ahora, esa matriz original que creó todavía está en la memory, además de que está liberando una matriz diferente.

También haces exactamente el mismo tipo de cosas con ordenetworkingDummyArray. Si asigna un object, no configure el puntero para apuntar a otra cosa.