2010-03-14 4 views
0

Selon mon exigence d'application, je montre les images de contact dans un UITableView comme indiqué ci-dessous.UITableView avec des problèmes d'image de contact

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath 
                   (NSIndexPath *)indexPath 
{ 
    //NSMutableArray *sourceArray = sourceList; 
    static NSString *identifier = @"CellIdentifier"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; 
    if (cell == nil) 
    { 
     //If not possible create a new cell 
     cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault      
      reuseIdentifier:identifier] autorelease]; 
     cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton; 
     cell.opaque = NO; 

     CGRect LabelFrame = CGRectMake(130, 33, 150, 13); 
     callImage = [[UIImageView alloc] initWithFrame:LabelFrame];//phone image 
     callImage.tag = 1; 
     [cell.contentView addSubview:callImage]; 
     [callImage release]; 
      ----- 
      ----- 
    } 
    UIImageView *callImage = (UIImageView *)[cell viewWithTag:1]; 
    ABRecordRef contact = [self getContact]; 
    if(contact && ABPersonHasImageData(contact)) 
    { 
     UIImage *contactImage = [UIImage imageWithData:(NSData*)ABPersonCopyImageData(contact)]; 
     callImage.image = contactImage; 
    } 
} 

J'ai deux problèmes si j'utilise le segment de code ci-dessus.

  1. Tableau Le défilement est trop lent. Si commentez le code "ajout d'image", alors UITable répond très rapidement.
  2. Gestion de la mémoire. Mon application a commencé à utiliser 25 à 30 Mo de RAM.

Existe-t-il une meilleure façon d'éviter les deux problèmes ci-dessus?

+0

Pourriez-vous poster le code complet de votre méthode cellForRowAtIndexPath? Votre problème est peut-être que vous ne réutilisez pas vos cellules correctement. – Vladimir

+0

Oui, je les réutilise correctement. Quoi qu'il en soit, je l'affiche dans ma question ci-dessus elle-même. – prathumca

Répondre

1

Vous avez une fuite de mémoire dans le code « en ajoutant de l'image ». ABPersonCopyImageData retourne un objet NSData conservé, que vous devez libérer après l'avoir utilisé pour initialiser votre UIImage, comme ceci:

NSData *contactImageData = (NSData*)ABPersonCopyImageData(contact); 
UIImage *contactImage = [UIImage imageWithData:]; 
[contactImageData release]; 

Une fois que vous avez fixé la fuite, les données d'image peuvent être désallouées chaque fois que les rouleaux de cellule de table correspondante hors de l'écran. Cela devrait résoudre vos problèmes de mémoire et de performance.

+0

J'ai déjà essayé celui-là aussi. Mais pas d'utilisation .. – prathumca

0

Qu'en est-il de la pré-mise en cache des images? Si vous accédez au sous-système Adressbook pour chaque cellule, cela pourrait être le problème? Un autre problème pourrait être l'appel imageWithData, car l'image doit être créée à partir de zéro à chaque fois. Il n'y a pas de mise en cache d'image ici. Si vous faites ceci avant de construire la table (accédant à cellForRow avec ceci) et stockez les images pré-rendues dans un NSMutableDictionary avec la clé ABRecordID?

Questions connexes