J'essaie de faire une recherche de base de table de sqlite et je continue à trébucher sur une fuite de mémoire que je ne peux pas comprendre, d'autant plus qu'elle n'apparaît qu'avec deux lignes équivalentes.Impossible de trouver la fuite de mémoire iPhone/Objective-C dans la récupération de données sqlite
Ce que je fais est simple:
-Créer un objet (catégorie) de tenir ma ligne de SQLite DB
-Avoir une méthode qui interroge SQLite et retourne un tableau de ces objetcs
Je mets tout le code ici (dépouillé un peu pour simplifier mais j'ai la fuite de mémoire avec ce même code).
category.h:
@interface Category : NSObject {
int catId;
NSString *description;
int order;
NSString *iconName;
}
@property(nonatomic, readwrite, assign) int catId;
@property(nonatomic, retain) NSString *description;
@property(nonatomic, readwrite, assign) int order;
@property(nonatomic, retain) NSString *iconName;
@end
category.m:
#import "Category.h"
@implementation Category
@synthesize catId;
@synthesize description;
@synthesize order;
@synthesize iconName;
@end
Procédé pour récupérer tableau:
-(NSMutableArray *)getAll {
NSString *query = "select id, description, catorder, image from category order by catorder";
sqlite3_stmt *statement;
NSMutableArray *categoryArray = [[NSMutableArray alloc] init];
if (sqlite3_prepare_v2([[Database sharedDatabase] instance], [query UTF8String], -1, &statement, nil) == SQLITE_OK) {
while (sqlite3_step(statement) == SQLITE_ROW) {
int dbId = sqlite3_column_int(statement, 0);
char *dbDescription = (char *)sqlite3_column_text(statement, 1);
int dbOrder = sqlite3_column_int(statement, 2);
char *dbIcon = (char *)sqlite3_column_text(statement, 3);
NSString *desc = [[NSString alloc] initWithUTF8String:dbDescription];
NSString *icon = [[NSString alloc] initWithUTF8String:dbIcon];
Category *category = [[Category alloc] init];
category.catId=dbId;
category.description = desc;
//category.description = @"Test";
category.order = dbOrder;
category.iconName = icon;
//category.icon = @"test.png";
[desc release];
[icon release];
[categoryArray addObject:category];
[category release];
}
sqlite3_finalize(statement);
}
[categoryArray autorelease];
return categoryArray;
}
Cette ligne fuites
NSString *icon = [[NSString alloc] initWithUTF8String:dbIcon];
Cette ligne ne
NSString *desc = [[NSString alloc] initWithUTF8String:dbDescription];
Voici ce que les instruments montre:
et quand je drill vers le bas:
Que vous dit l'analyseur statique? –
Essayez ce qui suit sans le libérer: NSString * icon = [NSString stringWithUTF8String: dbIcon]; – Franck
Que dit-il lorsque vous recherchez des fuites dans Instruments? –