2010-07-24 3 views
0

J'ai une UITableView avec une méthode cellForRowAtIndexPath qui crée un UITextView, puis l'ajoute à une cellule. Aucune fuite de mémoire n'a été détectée, mais lors de l'exécution d'Instruments (Allocations d'objets), la mémoire nette est sur un trajet aller à 18 Mo, où elle se bloque.Augmentation de la mémoire de cellFromRowAtIndexPath dans UITableView

Mon application ajoute et supprime en permanence des cellules dans la source de données tableView, mais comme le TextView est publié, je ne vois aucun moyen d'accumuler de la mémoire.

Voici mon cellForRowAtIndexPath code:

static NSString *[email protected]"Cell"; 
UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

if (cell==nil) { 
    // Build cell 
    cell=[[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:cellIdentifier] autorelease]; 
} 

cell.selectionStyle=UITableViewCellSelectionStyleNone; 

UITextView *tv=[[UITextView alloc] initWithFrame:CGRectMake(0, 0, 320, 95)]; 
tv.font=[UIFont fontWithName:@"Helvetica-Bold" size:16]; 

[email protected]"My Cell Text"; 

[cell addSubview:tv]; 
[tv release]; 

return cell; 

Merci à l'avance!

+0

Vous pouvez utiliser le modèle Leaks d'Instruments pour déboguer ce genre de chose. L'instrument Leaks montrera des objets qui existent encore mais rien de connu; l'instrument ObjectAlloc montrera tous les objets, ainsi vous pouvez explorer par classe et par instance pour voir ce qui pourrait les retenir. –

Répondre

2

Vous ajoutez UITextView à chaque fois qu'une cellule est extraite. Si elle vient de cache, il a déjà un comme sous-vue, maintenant il a deux d'entre eux, puis trois, puis quatre ...

Alors seulement les ajouter à nouvelles cellules:

if (cell==nil) { 
    // Build cell 
    cell=[[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:cellIdentifier] autorelease]; 
    cell.selectionStyle=UITableViewCellSelectionStyleNone; 

    UITextView *tv=[[UITextView alloc] initWithFrame:CGRectMake(0, 0, 320, 95)]; 
    tv.font=[UIFont fontWithName:@"Helvetica-Bold" size:16]; 
    tv.tag = 42; // Or whatever, if you don't want to use custom cells 
    [cell addSubview:tv]; 
    [tv release]; 
} 

UITextView *textView = (UITextView *) [cell viewWithTag:42]; 
[email protected]"hi"; 
+0

Merci, cela fonctionne bien, sauf si la dataSource est modifiée comme dans mon cas? La cellule affiche toujours les données mises en cache? – pop850

+0

Il affiche tout ce que vous définissez le texte, "salut" dans ce cas ... Si vous avez besoin de texte différent, c'est l'endroit pour le définir - en fonction de l'indexPath. Si vous avez besoin de le changer pendant l'affichage, vous devez recharger l'indexPath donné, c'est-à-dire [self.tableView reloadRowsAtIndexPaths: ... withAnimation: ...]; – Eiko

Questions connexes