2013-09-04 2 views
0

salut Im en posant cette question pour mon ami, qui est aux prises avec ce problème de mémoire fmdb. son projet lu une liste à partir d'un db, et il ouvre la db et lire les données pour chaque cellule, (ce qui est une bonne idée, mais il l'a fait), dans initialisation, init la file d'attente de base de données,fuites de mémoire fmdb ios

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

à cellForRowAtIndexPath, utilisez configCell pour faire des choses

- (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"]; 

} 

comme vous pouvez le voir, lire DB et réglé sur l'étiquette de la cellule; avec l'instrument, lors du défilement de la tableview, les allocations de mémoire augmente considérablement (de 800k augmente à 1,6m très bientôt), mais si vous commentez la ligne aCell.textLabel.text = [aUserRecord objectForKey: @ "user_name"]; semble pas beaucoup de fuites de mémoire que le scénario précédent, (de 800k à environ 900k). Par commentaire sur la ligne, on fait encore le travail de db, c'est étrange ici, il faut que quelque chose lie la cellule et le db ou le block, ce qui rend le tout mauvais.

Je vérifie le nombre de rétention de rs, aUserRecord ils sont 1, et semble normal. tout expert en bloc, DB, et FMDB pls partager vos opinions, acclamations

EDIT: la fonction fmdb inDatabase gère le bloc dans une file d'attente de répartition à traiter, j'ai essayé de supprimer le bloc, il suffit d'utiliser le db à faire le travail, les problèmes de mémoire reste, pls aider

Répondre

0

Peut-être que cela pourrait aider. Je devine juste.

aCell.textLabel.text = [NSString stringWithFormat:@"%@", [aUserRecord objectForKey:@"user_name"]];