Reputation: 31
I am getting a memory leak warning on Instruments for these lines:
NSString *name =[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0)];
year = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)];
Here is the code for this section:
-(NSMutableArray *)selectUsersList:(NSString *)condition:(NSString *)sort
{
NSMutableArray *users = [[NSMutableArray alloc] init];
if (sqlite3_open([self.databasePath UTF8String], &database) != SQLITE_OK)
{
sqlite3_close(database);
NSAssert(0, @"Failed to open database");
}
else
{
NSString *query = @"SELECT * FROM users";
if (condition != nil)
{
NSString *newQuery = [NSString stringWithFormat:@"%@ %@", query, condition];
query = newQuery;
}
if (sort != nil) {
NSString *newsort = [NSString stringWithFormat:@"%@ %@", query, sort];
query = newsort;
}
sqlite3_stmt *statement;
if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK)
{
while (sqlite3_step(statement) == SQLITE_ROW) {
NSString *name =[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0)];
}
NSString *year= @"";
if (sqlite3_column_text(statement, 2) != nil)
{
year = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 2)];
}
User *user = [[User alloc] initWithName:name year:year];
[users addObject:user];
[user release];
}
}
sqlite3_finalize(statement);
sqlite3_close(database);
}
return users;
}
I want to present an empty string and not 'nil' on the view so I am setting year to an empty string first. Is there a better way to do this? How can I solve this leak?
Thanks for your help!
Upvotes: 3
Views: 3974
Reputation: 43470
After the while loop, you must clear the sqlite3 statement's memory with sqlite3_finalize()
. So:
if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) {
while (sqlite3_step(statement) == SQLITE_ROW) {
NSString *name =[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0)];
NSString *year= @"";
if (sqlite3_column_text(statement, 1) != nil) {
year = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)];
}
User *user = [[User alloc] initWithName:name year:year];
[users addObject:user];
[user release];
}
sqlite3_finalize(statement); // DO THIS
}
Upvotes: 6