ios - iphone 应用程序中的内存泄漏 sqlite3MemMalloc

标签 ios iphone sqlite memory-leaks

我在 iphone 的仪器工具中发现 sqlite3Memmalloc 泄漏。我的应用程序消耗的内存超过 200 MB。在内存管理工具中,它显示 Responsible Library 作为 libsqlite3.dylib & Responsible caller 作为 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;
}

最佳答案

该代码中有很多可怕的错误,但与内存泄漏相关的错误是:

  • 你并不总是在 sqlite3_prepare_v2 成功后调用 sqlite3_finalize;和
  • 你并不总是在 sqlite3_open 成功后调用 sqlite3_close

您不能在某些 if/else 分支中隐藏这些调用。 重构您的代码,以便始终进行这些调用。

关于ios - iphone 应用程序中的内存泄漏 sqlite3MemMalloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21178877/

相关文章:

使用 MacPorts 1.8 在 Mac OS X 10.6 上安装 sqlite3 期间生成失败

ios - GCM 无法注册并出现 1003 错误

iphone - 如何根据 UILabel 中的数字显示文本

javascript - 如何从 SQLite 语句返回选定的值?

sqlite - 使用gorm的sqlite中的时间列

iphone - 在 Photoshop SDK 中发送多条消息

iphone - iOS 静态库和 Core Graphics 错误 : expected '=' , ',' , ';' , 'asm' 或 '__attribute__' 之前

ios - UIWebView,自定义 "return"键

ios - 处理响应输出

iphone - 有没有办法为 NSObjects 设置变量而不为每个变量创建属性?