2010-12-03 11 views
2

Je viens d'ajouter du code provenant du Apple docs qui montre comment utiliser les UITableViewCell personnalisés créés à partir d'une plume. Je suis nouveau dans le développement iOS, donc je suis toujours en train d'apprendre à propos de la gestion de la mémoire et le code n'est pas tout à fait clair pour moi sur la façon dont cela fonctionne en premier lieu. Quand j'exécute l'instrument Allocations, il montre la mémoire non allouée dans le code ci-dessous. Plus précisément, elle montre les UITableViewCells restent en vie après que le contrôleur de vue est sauté la pile de nav ...Développement iOS: Comment suis-je en train de mal gérer la mémoire dans ce code?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    static NSString *CellIdentifier = @"MyCustomCellIdentifier"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     [[NSBundle mainBundle] loadNibNamed:@"MyCustomCell_iPhone" owner:self options:nil]; //<--Allocations instrument complaining about this line 
     cell = customCell; 
     [self setCustomCell:nil]; 
    } 

    return cell; 
} 

customCell est une instance var défini dans ce contrôleur de vue, comme si ...

IBOutlet UITableViewCell *customCell; 
@property (nonatomic, retain) IBOutlet UITableViewCell *customCell; 

Y a-t-il un problème dans ce code?

Merci beaucoup pour votre sagesse!

+0

Espérons que vous avez également défini une @ propriété appelée customCell? –

+0

La cellule personnalisée doit-elle être un IBOutlet? Si vous cherchez simplement à charger une vente personnalisée, vous n'avez pas besoin d'être un point de vente. – DerekH

+0

DerekH, il doit être une sortie afin qu'il puisse câbler une poignée sur la cellule lorsque la plume est chargée. –

Répondre

2

Je compare le code de la documentation:

if (cell == nil) { 
    [[NSBundle mainBundle] loadNibNamed:@"TVCell" owner:self options:nil]; 
    cell = tvCell; 
    self.tvCell = nil; 
} 

Avec votre code:

if (cell == nil) { 
    [[NSBundle mainBundle] loadNibNamed:@"MyCustomCell_iPhone" owner:self options:nil]; 
    cell = [self customCell]; 
    [self setCustomCell:nil]; 
} 

Il semble y avoir une disparité dans la ligne où vous attribuez cell. L'exemple de code Apple utilise tvCell, la variable d'instance , alors que vous utilisez [self customCell], le getter de propriété pour la variable d'instance. Cela pourrait-il être la cause? Essayez de changer

cell = [self customCell]; 

à

cell = customCell; 
+0

merci, boulon, j'ai essayé ça et ça n'a pas semblé faire la moindre différence. l'instrument Allocations signale toujours que les UITableViewCells restent en vie après que le contrôleur de vue est sorti de la pile de navigation. – BeachRunnerFred

+0

merci d'avoir attrapé cela. cela ne semblait pas aider, mais cela pouvait affecter les choses ailleurs. Le problème était que UITableView contenant les cellules n'était pas désalloué correctement. Merci encore pour votre aide – BeachRunnerFred

+0

@BeachRunnerJoe: Pas de problème, content que vous l'ayez retrouvé à la fin. – BoltClock

1

Votre code me semble bon, dans la mesure où la mémoire est concerné.

Ce que je pense est que votre contrôleur de vue n'est pas en cours de publication. Dans ObjectAlloc, vous voyez que les cellules du tableau sont toujours conservées car elles sont conservées par votre vue de table, qui est à son tour détenue par votre contrôleur de vue ...

La raison la plus courante pour laquelle cela serait, serait oublier de définir tout ce qui utilise votre contrôleur de vue en tant que délégué à zéro dans dealloc.

Ou peut-être, mais plus improbable, vous ne libérez pas votre vue de table. Dans ObjectAlloc, après avoir quitté le contrôleur de vue, je vérifie pour voir si le contrôleur de vue lui-même est également en mémoire.

0

Utilisez le débogueur. Définir un point de rupture dans dealloc. Est-il appelé lorsque vous faites apparaître le contrôleur de navigation?