我的iphone中的乐器工具中有sqlite3Memmalloc泄漏。我的应用程序消耗超过200 MB的内存。在内存管理工具中,它将责任库显示为libsqlite3.dylib&负责的调用者为sqlite3MemMalloc。在我的应用程序中,我试图插入2000行。我认为由于内存使用情况,应用程序崩溃了。我检查了所有方面,但无法在我的sqlite代码中找到错误泄漏。请给我一个解决方案。下面是我的sqlite代码。
- (Boolean) insertQuotes:(QuotesInfo*)quote
{
NSString *dbPath = [dBManager GetConnectToDatabase];
sqlite3_stmt *selectstmt=nil;
if(sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK)
{
if(selectstmt == nil)
{
NSString* Query=[NSString stringWithFormat:@"insert into Quotes (QuoteID,QuoteDate,QuoteDesc,QuoteAuthor,QuoteCategory,QuoteCategoryID,QuoteAuthorID,QuoteFavourite,QuoteCategoryFilterStatus,QuoteAuthorFilterStatus,AuthorFirstName,AuthorLastName) values (%d, '%@', %@, '%@', '%@', %d, %d, %d, %d, %d, '%@', '%@')",quote.quoteId,quote.quoteDate,quote.quoteDesc,quote.quoteAuthor,quote.quoteCategory,quote.quoteCategoryID,quote.quoteAuthorID,quote.quoteFav,quote.quoteCategoryFilterStatus,quote.quoteAuthorFilterStatus,quote.authorFirstName,quote.authorLastName];
NSLog(@"Query %@",Query);
const char *sql = [Query UTF8String];
if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) != SQLITE_OK)
{
NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));
}
}
@try {
}
@catch (NSException * e) {
return NO;
NSLog(@"INSERT EXCEPTION %@",e);
//Handle the Exception here..
}
if(SQLITE_DONE != sqlite3_step(selectstmt)){
NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));
}
else{
sqlite3_reset(selectstmt);
sqlite3_finalize(selectstmt);
sqlite3_close(database);
return YES;
}
}
return NO;
}
答案 0 :(得分:2)
该代码中存在许多可怕的错误,但与内存泄漏相关的错误是:
sqlite3_finalize
成功后,您并不总是致电sqlite3_prepare_v2
;和sqlite3_close
成功后,您并不总是致电sqlite3_open
。您不得在某个if
/ else
分支中隐藏这些来电。
重构您的代码,以便始终进行这些调用。