2012-01-09 4 views
0

私はデータクエリを使用してUITableViewに表示するアプリケーションを持っています。これまでのところ、SQLiteデータベースにアクセスして、テーブルにデータを表示することができますが、私のappメモリを短期間使用した後で警告メッセージを受け取りました。レベル= 1で閉じます。検索ツールで分析ツールを使用すると、私のアプリケーションデータが妥当な量のメモリを消費していることがわかりました。質問のメモリ割り当て

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 

    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 

    tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine; 

    return [count count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    iMapDadosClientes *dadosClientes = (iMapDadosClientes *)[count objectAtIndex:indexPath.row]; 

    NSString *myIdent = @"myIdent"; 

    iMapGrid *grid = (iMapGrid *)[tableView dequeueReusableCellWithIdentifier:myIdent]; 

    tvDadosClientes.autoresizesSubviews = YES; 

    if (grid == nil) { 

     grid = [[[iMapGrid alloc] initWithFrame:CGRectZero reuseIdentifier:myIdent] autorelease]; 

     UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(0.0, 0, 50.0, tableView.rowHeight)] autorelease]; 

     [grid addColumn:60]; 

     label.tag = TAG_1; 
     label.font = [UIFont systemFontOfSize:14.0]; 
     label.text = dadosClientes.cod; 
     label.textAlignment = UITextAlignmentRight; 
     label.textColor = [UIColor blackColor]; 
     label.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight; 

     [grid.contentView addSubview:label]; 

     label = [[[UILabel alloc] initWithFrame:CGRectMake(70.0, 0, 20.0, tableView.rowHeight)] autorelease]; 

     [grid addColumn:100]; 

     label.tag = TAG_2; 
     label.font = [UIFont systemFontOfSize:14.0]; 
     label.text = dadosClientes.loja; 
     label.textAlignment = UITextAlignmentCenter; 
     label.textColor = [UIColor blackColor]; 
     label.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight; 

     [grid.contentView addSubview:label]; 

     label = [[[UILabel alloc] initWithFrame:CGRectMake(110.0, 0, 350.0, tableView.rowHeight)] autorelease]; 

     [grid addColumn:470]; 

     label.tag = TAG_3; 
     label.font = [UIFont systemFontOfSize:14.0]; 
     label.text = dadosClientes.nome; 
     label.textAlignment = UITextAlignmentLeft; 
     label.textColor = [UIColor blackColor]; 
     label.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight; 

     [grid.contentView addSubview:label]; 

     label = [[[UILabel alloc] initWithFrame:CGRectMake(480.0, 0, 240.0, tableView.rowHeight)] autorelease]; 

     [grid addColumn:730]; 

     label.tag = TAG_4; 
     label.font = [UIFont systemFontOfSize:14.0]; 
     label.text = dadosClientes.mun; 
     label.textAlignment = UITextAlignmentLeft; 
     label.textColor = [UIColor blackColor]; 
     label.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight; 

     [grid.contentView addSubview:label]; 

     label = [[[UILabel alloc] initWithFrame:CGRectMake(740.0, 0, 20.0, tableView.rowHeight)] autorelease]; 

     [grid addColumn:768]; 

     label.tag = TAG_5; 
     label.font = [UIFont systemFontOfSize:14.0]; 
     label.text = dadosClientes.est; 
     label.textAlignment = UITextAlignmentCenter; 
     label.textColor = [UIColor blackColor]; 
     label.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleHeight; 

     [grid.contentView addSubview:label]; 
    } 

    UILabel *label_1 = (UILabel *)[grid.contentView viewWithTag:TAG_1]; 
    label_1.text = dadosClientes.cod; 

    UILabel *label_2 = (UILabel *)[grid.contentView viewWithTag:TAG_2]; 
    label_2.text = dadosClientes.loja; 

    UILabel *label_3 = (UILabel *)[grid.contentView viewWithTag:TAG_3]; 
    label_3.text = dadosClientes.nome; 

    UILabel *label_4 = (UILabel *)[grid.contentView viewWithTag:TAG_4]; 
    label_4.text = dadosClientes.mun; 

    UILabel *label_5 = (UILabel *)[grid.contentView viewWithTag:TAG_5]; 
    label_5.text = dadosClientes.est; 

    return grid; 
} 

- (void) getInitialDataToDisplay:(NSString *)dbPath { 

    count = [[NSMutableArray alloc] init]; 

    if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) { 

     const char *sql = "select cod, loja, nome, mun, est from apsa1010;"; 
     sqlite3_stmt *selectstmt; 

     if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) { 

      while(sqlite3_step(selectstmt) == SQLITE_ROW) { 

       iMapDadosClientes *dadosClientes = [[iMapDadosClientes alloc] cod:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 0)] loja:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)] nome:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)] pessoa:nil ender:nil bairro:nil mun:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 3)] est:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 4)] tel:nil bco1:nil risco:nil classe:nil lc:nil transp:nil ultCom:nil statCli:nil metr:nil salDup:nil uligTlv:nil dCompra:nil vend:nil celul:nil fax:nil email:nil contato:nil dtCada:nil priCom:nil dtNac:nil dtFunda:nil recno:nil]; 

       [count addObject:dadosClientes]; 

       [dadosClientes release]; 



       dadosClientes = nil; 
      } 
     } 

     sqlite3_finalize(selectstmt); 
    } 
    else 
     sqlite3_close(database); //Even though the open call failed, close the database connection to release all the memory. 
} 

- (void) finalizeStatements { 

    if(database) 
     sqlite3_close(database); 
} 

誰かが私のコードで間違っているかもしれないことのヒントを教えてくれます。ありがとうございました。

答えて

0

わかりません。

すべてのsqlite呼び出しの戻りコードを常に確認してください。たとえば、sqlite3_finalizeにはsqlite3_closeと同様の戻りコードがあります。ファイナライズが成功しない場合(たとえば、ビジー状態の場合)、クローズアップする必要があります(必ずしもそうではありません)。することができますが、後方参照(あなたのケースで& SELECTSTMTを)あなたを与えるSQLステートメントは

  • が準備をコンパイル:あなたが見なければならないメモリの問題の

    if (_sqlite3) 
    { 
        int rc = sqlite3_close(_sqlite3); 
    
        if (rc == SQLITE_BUSY) 
        { 
         sqlite3_stmt *stmt; 
         while ((stmt = sqlite3_next_stmt(_sqlite3, 0x00)) != 0) 
         { 
          sqlite3_finalize(stmt); 
         } 
    
         rc = sqlite3_close(_sqlite3); 
        } 
    
        if (rc != SQLITE_OK) 
        { 
         NSLog(@"close not OK. rc=%d", rc); 
        } 
    
        _sqlite3 = NULL; 
    } 
    

    外:ここに私のクローズ機能です。毎回それを再コンパイルするべきではありません。代わりに、リファレンスを捨てて、再度使用する前にsqlite3_resetを呼び出し、コードのその領域をクリーンアップするまでファイナライズしないでください。これにより、VBLから何度も同じコンパイルされたステートメントを使用することができます。

  • いつも開いたり閉じたりするのはなぜですか?これは、SQL Serverクライアントまたは接続プールを持つものではありません。それを開いたままにして、コンパイルされたステートメントを再利用し、キャッシュとコンパイルされたステートメントから利益を得ます。

0

保持されているがリークされていないメモリによる漏れとメモリの損失を調べるために、機器を使用してください。後者はまだ使用されていない未使用のメモリです。インストゥルメンツの割り当てシステムでヒープショットを使用する。

ハウツー使用Heapshotは、メモリcreapを見つけるために

は、以下を参照してください。

bbum blogは、基本的にはこの方法では、楽器のツールを割り当てる実行heapshotを取る、あなたのコードの直感と3または4回繰り返し、別のheapshotを実行することがあります。これは、反復中に割り当てられ、解放されないメモリを示します。

結果を理解するために、個々の割り当てを参照してください。

あなたが保持し、リリースおよび自動解放オブジェクトの使用機器で発生場所を確認する必要がある場合:楽器で

実行]を、割り当てに(このオプションを設定するには、記録を停止しなければならない上に「レコードの参照カウント」を設定)。ピッカーを実行し、録画を停止し、ivar(datePickerView)を検索し、ドリルダウンして、すべての保持、リリース、および自動リースが発生した場所を確認することができます。これらは、あなたのメモリの問題が、ここを見ていくつかのことをしている場合だ