Утечка памяти в методе - PullRequest
       27

Утечка памяти в методе

0 голосов
/ 01 марта 2012

У меня утечка памяти в методе, который читает данные из БД. Если я правильно понимаю, все зло живет в этой конкретной строке:

enter image description here

весь список методов:

-(NSMutableArray*)returnNominals:(int)subCountryID
{
NSArray *paths =
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *path =
[documentsDirectory stringByAppendingPathComponent:databaseName];

NSMutableArray *nominals=[[[NSMutableArray alloc]init]autorelease];

if (sqlite3_open([path UTF8String], &database) == SQLITE_OK)
{

const char* sqlNominals=sqlite3_mprintf("SELECT noms.nominalID, noms.nominal,noms.nominalName,rel.nominalImg,noms.priority\
FROM nominals AS noms\
INNER JOIN NominalsAndSubCountriesRelation as rel\
ON noms.nominalID=rel.NominalID\
WHERE rel.SubcountryID=%i\
ORDER BY noms.priority",subCountryID);

       sqlite3_stmt *statement;
int sqlResult = sqlite3_prepare_v2(database, sqlNominals, -1, &statement, NULL);

if ( sqlResult== SQLITE_OK)
{
    while (sqlite3_step(statement) == SQLITE_ROW)
    {
        Nominal *nom=[[Nominal alloc]init];
        nom.nominalID=sqlite3_column_int(statement, 0);
        char *nominal=(char *)sqlite3_column_text(statement, 1);
        char *nominalName=(char*)sqlite3_column_text(statement, 2);
        char *nominalImg=(char*)sqlite3_column_text(statement, 3);
        nom.nominal=(nominal)?[NSString stringWithUTF8String:nominal]: @"";
        nom.nominalName=(nominalName)?[NSString stringWithUTF8String:nominalName]: @"";
        nom.nominalImg=(nominalImg)?[NSString stringWithUTF8String:nominalImg]: @"noimg";
        [nominals addObject:nom];
        [nom release];
    }
    sqlite3_finalize(statement);
}
}
else
{
    [self dbConnectionError];
}
    return nominals;
}

И, наконец, когда viewDidLoad в другом классе использует этот метод:

.h

    @interface Nominals : UIViewController 
   {
     NSMutableArray *nominalsArr;
     NSInteger subCountryID;
   }
   @property(nonatomic,retain)NSMutableArray *nominalsArr;
   @property(nonatomic)NSInteger subCountryID;

.m

- (void)viewDidLoad
{
[super viewDidLoad];
 [[self navigationController]setToolbarHidden:YES animated:YES];
    DBAccess *dbAccsess=[[DBAccess alloc]init];
    self.nominalsArr=[dbAccsess returnNominals:subCountryID];
    [dbAccsess closeDataBase];
    [dbAccsess release];
}
- (void)dealloc
{
[tableView release];
[searchBar release];
[_toolBar release];
[nominalsArr release];
[searchController release];
[filteredItems release];
[super dealloc];
}

Another image

Я проверил свой код с помощью анализатора, и он говорит, что у меня нет проблем.

Пожалуйста, помогите мне устранить эту утечку.

1 Ответ

2 голосов
/ 01 марта 2012

У вас есть утечка sqlNominals.

Подпрограммы sqlite3_mprintf() и sqlite3_vmprintf() записывают свои результаты в память, полученную из sqlite3_malloc().Строки, возвращенные этими двумя подпрограммами, должны быть освобождены sqlite3_free().

...