【问题标题】:Memory issue in ARCARC中的内存问题
【发布时间】:2013-05-27 05:14:41
【问题描述】:

我使用 UINavigationcontroller 作为根视图控制器。我是 ARC 下的 iphone ARC 和 sqlite 操作的新手。

  1. 我的 rootviewcontroller 是 loginviewcontroller,接下来是 homeview,其中包含带有 4 个 UIviewcontroller 的 scrollView。
  2. 我正在使用 Instruments 进行测试,因为我收到了内存警告。使用我的应用程序大约 5-10 分钟后,当我注销(为此我使用 popToRootViewController)并再次登录时,Live Bytes 继续增加并且当我检查调用树时 -

     [NSObject(NSTreadPerformAdditions) performselectorOnMainThread:withObject:waituntilDone:] 
    

显示 15.91MB Bytes 已使用,随后显示

我也在做 SQLite 操作,在执行这些操作时,它会在周围添加

if(sqlite3_open([[self filePath]UTF8String],&dBObject)!= SQLITE_OK)

显示 10MB 实时字节用于开放数据库、选择查询和更新

我第一次使用 Instruments 测试我的应用程序,它显示以下内容:

我现在如何释放这段记忆?

编辑:

我正在使用此代码检索数据

-(int)CheckCompanyIsAvailableInTradeList:(NSString *)CompanyId UserId:(NSString *)userId
{
int check=0;
if(sqlite3_open([[self filePath] UTF8String], &dBObject) == SQLITE_OK) {
    NSString *sqlStatement =NULL;
    sqlStatement = [ NSString stringWithFormat:@"SELECT COUNT(*) FROM tradelist WHERE compnyID = '%@' and UserMasterID ='%@' ;",CompanyId,userId];

    if(sqlite3_prepare_v2(dBObject, [sqlStatement UTF8String], -1, &statement, NULL) == SQLITE_OK) {
        @autoreleasepool {
            while(sqlite3_step(statement) == SQLITE_ROW) {
                check = sqlite3_column_int(statement, 0);

            }
        }



    }
    sqlite3_finalize(statement);

}
sqlite3_close(dBObject);
return check;

}

每当调用此方法时,活动字节都会继续增加 不断地

【问题讨论】:

  • 在完成对 DB 的操作后,您是否在调用 sqlite3_close(dbObject)
  • 感谢回复是的,我已经做到了
  • 能否在你的问题中添加一个功能码?
  • 检查我已经给了sn-p
  • 您是否在循环/递归中调用任何 db 函数?如果是这种情况,尽量不要每次都打开和关闭连接,而是保持连接打开,直到递归结束,然后关闭它。

标签: iphone ios objective-c sqlite


【解决方案1】:

试试这个,

在开始循环之前,您必须打开数据库...

完成后你必须关闭你的数据库..

例如

 -(void)downloadData
 {
 [self  openDB];// database is open..

 // start your loop 
for (int i=0; i<[array count]; i++)
{
   [self executeInsertQuery];

}

[self  closeDb]; 
 }


-(void)openDB
{
 if(sqlite3_open([[self filePath]UTF8String],&dBObject)!= SQLITE_OK)
{
    sqlite3_close(dBObject);
}

} 


-(void)closeDb
{
if (dBObject)
{

    int rc = sqlite3_close(dBObject);
    NSLog(@"close rc=%d", rc);

    if (rc == SQLITE_BUSY)
    {

        sqlite3_stmt *stmt;
        while ((stmt = sqlite3_next_stmt(dBObject, 0x00)) != 0)
        {
            NSLog(@"finalizing stmt");
            sqlite3_finalize(stmt);
        }

        rc = sqlite3_close(dBObject);
    }

    if (rc != SQLITE_OK)
    {
        NSLog(@"close not OK.  rc=%d", rc);
    }

    dBObject = NULL;
}

}

  -(Bool)executeInsertQuery
{


  NSString* strQuery=[NSString stringWithFormat: @"Insert into   list(compnyID,UserMasterID) values('%@','%@');",companyId ,userId ];

 char *err;
if (sqlite3_exec(dBObject, [queryString UTF8String], NULL,NULL, &err)!= SQLITE_OK)
{
    sqlite3_close(dBObject);
    return NO;
}
else
{
    return YES;
}


}

【讨论】:

  • 这对我有用。谢谢,因为这个我很头疼
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-06
  • 1970-01-01
  • 2014-06-15
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
相关资源
最近更新 更多