Aidez-moi s'il vous plaît avec le problème suivant:problèmes de mémoire avec NSMutableDictionary, provoquant des fuites de mémoire NSCFDictionary
- (NSDictionary *)getGamesList
{
NSMutableDictionary *gamesDictionary = [[NSMutableDictionary dictionary] retain];
// I was trying to change this on the commented code below, but did have no effect
// NSMutableDictionary *gamesDictionary = [[NSMutableDictionary alloc] init];
// [gamesDictionary retain];
while (sqlite3_step(statement) == SQLITE_ROW)
{
NSString *key = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)];
NSArray *gameDate = [key componentsSeparatedByString:@" "];
NSNumber *_id = [[NSNumber alloc] initWithInt:sqlite3_column_int(statement, 0)];
NSString *date_time = [NSString stringWithFormat:@"%@, %@",[gameDate objectAtIndex:0],[gameDate objectAtIndex:2]];
if (![gamesDictionary valueForKey:date_time]) [gamesDictionary setValue:[NSMutableArray array] forKey:date_time];
[[gamesDictionary valueForKey:date_time] addObject:[[_id copy] autorelease]];
[_id release];
}
sqlite3_reset(statement);
return gamesDictionary;
}
Les mises en fuite dans une autre méthode d'une autre classe, il la méthode getGamesList est appelée, comme ceci:
NSMutableDictionary *gamesDictionary;
gamesDictionary = [[NSMutableDictionary dictionaryWithDictionary:[appDelegate getGamesList]] retain];
Après cela, il y a beaucoup de fuites qui pointe vers NSCFArray dans la chaîne:
NSArray *keys = [[NSArray arrayWithArray:[gamesDictionary allKeys]] retain];
dans cette méthode:
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
NSArray *keys = [[NSArray arrayWithArray:[gamesDictionary allKeys]] retain];
if ([keys count] != 0) return [[keys objectAtIndex:section] uppercaseString];
return @"";
}
Je suppose ces choses sont reliées les unes aux autres, mais je ne comprends toujours pas tous les conseils de gestion de la mémoire. Merci beaucoup!
OUI! Cela a réglé le problème! Merci beaucoup, vous m'avez fait plaisir :) Tout est correct, sauf que le retour [gamesDictionary autorelease]; dans cette construction conduit à une erreur EXC_BAD_ACCESS. Juste utilisé retour gamesDictionary à la place et tout est devenu clair! Merci encore! – lonlywolf
Oui, mon erreur. Vous n'avez pas 'créé' le gamesDictionary, donc vous n'êtes pas responsable de sa gestion de la mémoire, vous n'avez donc pas besoin de l'appeler 'autorelease'. – Abizern
Il semble que c'était juste un sommet d'un iceberg. J'ouvre une nouvelle vue dans laquelle getGamesList est appelée (les fuites de mémoire ne signalent aucune erreur), puis je retourne à la vue parents et obtiens beaucoup de fuites. Ce sont: NSCFArray dans if (! [GamesDictionary valueForKey: date_time]) [gamesDictionary setValue: [Tableau NSMutableArray] forKey: date_time]; et NSCFString dans NSString * date_time = [NSString stringWithFormat: @ "% @,% @", [gameDate objectAtIndex: 0], [gameDate objectAtIndex: 2]]; et NSCFNumber dans NSNumber * _id = [[NSNumber alloc] initWithInt: sqlite3_column_int (instruction, 0)]; :) – lonlywolf