当我使用sqlite时,有6MB的内存泄漏。现在我正在测试getBookWithIdTest方法。
-(IBAction) onTest:(id)sender
{
NSAutoreleasePool *myPool = [[NSAutoreleasePool alloc] init];
for (int i=0; i<100; i++)
{
[DatabaseManager getBookWithIdTest:i];
}
[myPool drain];
} 我有6 MB的内存泄漏。但是为什么呢?
+ (BookSettings *)getBookWithIdTest:(int)abookId
{
BookSettings *book = [[[BookSettings alloc] init] autorelease];
sqlite3 *database;
if(sqlite3_open([DatabaseManager databasePath], &database) == SQLITE_OK)
{
sqlite3_stmt *compiledStatement;
//FIRST PART
const char *sqlStatementBook = [[NSString stringWithFormat:@"SELECT * FROM t_abooks"] cStringUsingEncoding:NSASCIIStringEncoding];
if(sqlite3_prepare_v2(database, sqlStatementBook, -1, &compiledStatement, NULL) == SQLITE_OK)
{
while(sqlite3_step(compiledStatement) == SQLITE_ROW)
{
}
}
else NSLog(@"sqlite3_prepare_v2 error %s", sqlite3_errmsg(database));
sqlite3_reset(compiledStatement);
//END FIRST PART
// SECOND PART
const char *sqlStatementAuthors = [[NSString stringWithFormat:@"SELECT * FROM t_authors"] cStringUsingEncoding:NSASCIIStringEncoding];
if(sqlite3_prepare_v2(database, sqlStatementAuthors, -1, &compiledStatement, NULL) == SQLITE_OK)
{
while(sqlite3_step(compiledStatement) == SQLITE_ROW)
{
}
}
else NSLog(@"sqlite3_prepare_v2 error %s", sqlite3_errmsg(database));
sqlite3_reset(compiledStatement);
//END SECOND PART
sqlite3_finalize(compiledStatement);
} else NSLog(@"sqlite3_open error");
sqlite3_close(database);
return book;
} 但如果我删除了第一部分或第二部分,我就不会有任何泄漏。例如
+ (BookSettings *)getBookWithIdTest:(int)abookId
{
BookSettings *book = [[[BookSettings alloc] init] autorelease];
sqlite3 *database;
if(sqlite3_open([DatabaseManager databasePath], &database) == SQLITE_OK)
{
sqlite3_stmt *compiledStatement;
//FIRST PART -removed
// SECOND PART
const char *sqlStatementAuthors = [[NSString stringWithFormat:@"SELECT * FROM t_authors"] cStringUsingEncoding:NSASCIIStringEncoding];
if(sqlite3_prepare_v2(database, sqlStatementAuthors, -1, &compiledStatement, NULL) == SQLITE_OK)
{
while(sqlite3_step(compiledStatement) == SQLITE_ROW)
{
}
}
else NSLog(@"sqlite3_prepare_v2 error %s", sqlite3_errmsg(database));
sqlite3_reset(compiledStatement);
sqlite3_finalize(compiledStatement);
} else NSLog(@"sqlite3_open error");
sqlite3_close(database);
return book;
}发布于 2012-02-27 05:07:22
我解决了这个问题。我需要添加
sqlite3_finalize(compiledStatement);到第一部分的末尾。
https://stackoverflow.com/questions/9454099
复制相似问题