5

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

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

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

显示使用的 15.91MB 字节,然后显示

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

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

显示10MB Live Bytes用于 opendatabase、selectquery 和 update

我第一次使用 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;

}

每当调用此方法时,活动字节都会持续增加

4

1 回答 1

2

尝试这个,

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

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

例如

 -(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;
}


}
于 2013-06-01T09:28:26.757 回答