Dans mon application, j'ai eu des fuites de mémoire dans NSMutableArray, NSArray et NSString.Fuite de mémoire dans NSMutableArray, NSArray, NSString dans iPhone SDK
Voici le code.
NSString *subQuery = [NSString stringWithFormat:@"SELECT %@ FROM tbl_lang WHERE glossary = '%@'",append1,glossaryName];
NSArray *subArray1 = [[[self returnExecuteQuery:subQuery] mutableCopy] autorelease];
[subArray addObjectsFromArray:subArray1];
NSString *columnQuery = [NSString stringWithFormat:@"select AutoID,%@ from tbl_lang where glossary='%@'",lblshortName.text,glossaryName];
NSArray *newArray =[[[self returnExecuteQuery:columnQuery] mutableCopy] autorelease];
[langArray addObjectsFromArray:newArray];
NSMutableArray *tempArray = [[NSMutableArray alloc] init];
for (int i=0; i<[newArray count]; i++) {
NSString *cellText = [[newArray objectAtIndex:i] valueForKey:[NSString stringWithFormat:@"%@",lblshortName.text]];
if (cellText != (NSString *)[NSNull null] && ![cellText isEqualToString:@""]) {
NSString *decodedString3 = [NSString stringWithUTF8String:[cellText cStringUsingEncoding:[NSString defaultCStringEncoding]]];
[tempArray addObject:[NSString stringWithFormat:@"%@ : %@",lblshortName.text, decodedString3]];
}
else {
[tempArray addObject:@"<empty>"];
}
NSString *detail = @"_________________";
for (int j=0; j<[lableNameArray count]; j++) {
NSString *checkNull=[[subArray1 objectAtIndex:i] valueForKey:[NSString stringWithFormat:@"%@",[lableNameArray objectAtIndex:j]]];
if(checkNull != (NSString *)[NSNull null] && checkNull.length > 0)
{
NSString *decodedString4 = [NSString stringWithUTF8String:[checkNull cStringUsingEncoding:[NSString defaultCStringEncoding]]];
detail = [NSString stringWithFormat:@"%@\n%@ : %@ ",detail,[lableNameArray objectAtIndex:j],decodedString4];
}
}
[detailTextArray addObject:detail];
}
Quand je cours dans Instruments je suis arrivé fuites dans
-subArray1 en deuxième ligne.
-détail (NSString) dans la seconde pour la boucle.
Et subArray et langArray sont mes tableaux globaux.
Si je supprime mutableCopy
de NSArray *newArray =[[[self returnExecuteQuery:columnQuery] mutableCopy] autorelease];
et NSArray *subArray1 = [[[self returnExecuteQuery:subQuery] mutableCopy] autorelease];
alors subArray et langArray ne retiennent pas les valeurs.
Comment éviter les fuites de mémoire dans ce code?
Qu'est-ce que '-returnExecuteQuery:' faire? Renvoie-t-il un objet possédé ou non? Est-ce que son contrat dit quelque chose sur la validité de la valeur de retour pour plusieurs appels? –
Est-ce que vous libérez tempArray? où? En outre, essayez de libérer subArray1 et newArray (au lieu de les libérer) après le addObjectsFromArray. – Sefran2
@Fran: J'ai essayé de libérer les deux tableaux après la boucle principale, mais cela me donne l'erreur EXEC_BAD_ACCESS pour subArray et langArray. – Meghan