我在從db中讀取數據的方法中有內存泄漏。如果我的理解對不對,整個邪惡的生活在這個特殊的字符串:方法中的內存泄漏
整個方法列表:
-(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];
}
我檢查了我的分析代碼,它說我有沒有問題。
請幫我解決這個漏洞。
你在哪裏發佈'sqlNominals'? – Bot 2012-03-01 00:48:06
我必須發佈它嗎? – NCFUSN 2012-03-01 00:50:19
對不起,我認爲那裏有一個分配。 – Bot 2012-03-01 00:53:04