2012-03-01 2 views
0

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

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

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

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

+0

Где вы выпускаете 'sqlNominals'? – Bot

+0

Должен ли я его отпустить? – NCFUSN

+0

Извините, я думал, что там есть выделение. – Bot

ответ

2

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

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

+0

??? Что это за ответ? Я думаю, он понимает, что у него есть утечка ... – Bot

+0

@Nathan ROFL !!!! – Bot

+0

Проверьте изменения ... – fbernardo

Смежные вопросы