2010-08-02 10 views
0

C'est quelque chose que je ne comprends pas. Regardez cette méthode (copiée à partir de http://blog.blackwhale.at/2009/07/uibutton-in-uitableview-footer/)iphone - fuira-t-il?

Voir que footerView est alloué au début du code et jamais libéré. D'après ce que je comprends, l'objet devrait être autolibéré ou au moins libéré après avoir été utilisé sur un cas normal, mais comme cette méthode est exécutée automatiquement par les tables lorsqu'elles sont construites, où cette vue sera-t-elle publiée ...

ou fuira-t-elle? J'ai vu des exemples de code Apple avec des trucs comme ça, donc je suppose que l'objet est sorti quelque part ... mais où?

// custom view for footer. will be adjusted to default or specified footer height 
// Notice: this will work only for one section within the table view 
- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section { 

    if(footerView == nil) { 
     //allocate the view if it doesn't exist yet 
     footerView = [[UIView alloc] init]; 

     //we would like to show a gloosy red button, so get the image first 
     UIImage *image = [[UIImage imageNamed:@"button_red.png"] 
    stretchableImageWithLeftCapWidth:8 topCapHeight:8]; 

     //create the button 
     UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
     [button setBackgroundImage:image forState:UIControlStateNormal]; 

     //the button should be as big as a table view cell 
     [button setFrame:CGRectMake(10, 3, 300, 44)]; 

     //set title, font size and font color 
     [button setTitle:@"Remove" forState:UIControlStateNormal]; 
     [button.titleLabel setFont:[UIFont boldSystemFontOfSize:20]]; 
     [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; 

     //set action of the button 
     [button addTarget:self action:@selector(removeAction:) 
         forControlEvents:UIControlEventTouchUpInside]; 

     //add the button to the view 
     [footerView addSubview:button]; 
    } 

    //return the view for the footer 
    return footerView; 
} 

merci.

+3

L'iPhone peut fuir, mais l'iPad est super absorbant. – JasCav

Répondre

2

En voyant footerView est une variable d'instance sur cette classe, ce code est correct. footerView n'est pas auto-libéré (par vous, de toute façon) donc il continuera à exister tant que vous ne l'avez pas (parce que vous "possédez"/conservé en l'affectant). Le bon endroit pour le faire serait dans la méthode dealloc de cette classe.

Tant que vous faites cela, ce code me semble correct. :)

+0

mais supposons que pendant la majeure partie du temps une classe donnée ne soit jamais désallouée et pendant la même période, une table est construite plusieurs fois. Pour chaque fois que cette table est construite et affichée, un nouveau footerView sera créé, n'est-ce pas? Donc, ce sera un tas de footerViews qui fuit et juste le dernier sera libéré lorsque la classe est partie, non? (en supposant que la table ne soit pas une classe mais une partie d'une classe) .... – SpaceDog

+0

@Digital si vous instanciez cette classe plusieurs fois, alors oui vous créerez plusieurs vues de pied. Cependant, si cette classe n'est instanciée qu'une seule fois, il n'y aura qu'une seule vue d'ensemble. Cependant, c'est un peu hors sujet (je pense). Tant que vous libérez la vue d'ensemble lorsque la classe est désallouée, votre gestion de la mémoire est correcte. –

+0

ahhh et comment puis-je libérer la vue sur la méthode dealloc si cette vue est créée localement par la méthode? Devrais-je stocker une référence à utiliser sur dealloc? Ou simplement faire partie d'une classe rendra la vue libérée automatiquement? – SpaceDog

1

footerView est une variable d'instance. Est-il publié dans le dealloc de la classe?