0

こんにちは、この fmdb メモリの問題に苦しんでいる私の友人にこの質問をしています。彼のプロジェクトはデータベースからリストを読み取り、データベースを開き、各セルのデータを読み取ります (これは良い考えではありませんが、彼は実行しました)、初期化で、データベース キューを初期化し、

 databaseQueue = [[FMDatabaseQueue alloc] initWithPath:_dbPath];

cellForRowAtIndexPath では、configCell を使用して処理を行います

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString * addressBookTableViewCellIdentifier = @"AddressBookTableViewCell";
AddressBookTableViewCell * cell = (AddressBookTableViewCell*)[tableView dequeueReusableCellWithIdentifier:addressBookTableViewCellIdentifier];
if (cell == nil)
{
    // Create a cell to display an ingredient.
    cell = [[[AddressBookTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle
                                            reuseIdentifier:addressBookTableViewCellIdentifier]
            autorelease];
    cell.selectionStyle = UITableViewCellSelectionStyleBlue;
}
[self configCell:cell atIndexPath:indexPath];
return cell;

}

-(void)configCell:(AddressBookTableViewCell *)aCell atIndexPath:(NSIndexPath *)indexPath{

__block  NSDictionary *aUserRecord = nil;

NSString *_userName = nil;

   [databaseQueue inDatabase:^(FMDatabase *db) {

        [db open];
        int offset = 0;

        offset +=indexPath.row;

        NSString *str = [NSString stringWithFormat:@"SELECT table_ems_user.pid,\
                         table_ems_user.user_id,\
                         table_ems_user.user_name,\
                         table_ems_user.sex,\
                         table_ems_user.jid,\
                         table_ems_user.signature,\
                         table_ems_user.head\
                         FROM table_ems_user order by name_spell limit %d,1",offset];
        FMResultSet *_rs = [db executeQuery:str];
        while ([_rs next]) {
            aUserRecord = [_rs resultDictionary];
        }
        [_rs close];
        [db close];
    }];

    aCell.textLabel.text = [aUserRecord objectForKey:@"user_name"];

}

ご覧のとおり、DB から読み取り、セルのラベルに設定します。インストゥルメントを使用すると、テーブルビューをスクロールすると、メモリ割り当てが劇的に増加します (800k から 1.6m にすぐに増加します)。前のシナリオ (800k から約 900k まで) よりも多くのメモリ リークはないようです。

行にコメントを付けることで、まだデータベースの作業を行っていますが、ここでは奇妙です。何かがセルとデータベースまたはブロックをリンクしている必要があり、全体が悪くなります。

rs,aUserRecord の保持カウントを確認すると、それらは 1 であり、正常に見えます。ブロック、DB、および FMDB のエキスパートなら、ご意見をお聞かせください。

編集: fmdb inDatabase 関数は、処理するディスパッチ キューへのブロックを管理します。ブロックを削除しようとしました。単純に db を使用してジョブを実行します。メモリの問題は残ります。pls ヘルプ

4

1 に答える 1

0

多分これが役立つかもしれません。推測するだけです。

aCell.textLabel.text = [NSString stringWithFormat:@"%@", [aUserRecord objectForKey:@"user_name"]];
于 2013-11-25T13:03:56.310 に答える