2010-11-16 3 views
0

Je suis d'ajouter une vue personnalisée à un tableHeaderView avec le code suivant:Où est la fuite de mémoire?

imageButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    imageButton.frame = CGRectMake(120, 12, 64, 64); 
    imageButton.titleLabel.font = [UIFont systemFontOfSize:10]; 
    imageButton.titleLabel.lineBreakMode = UILineBreakModeWordWrap; 
    imageButton.titleLabel.textAlignment = UITextAlignmentCenter; 
    [imageButton setTitle:NSLocalizedString(@"Choose\nPhoto", @"Choose\nPhoto") forState:UIControlStateNormal]; 
    [imageButton addTarget:self action:@selector(photoButtonPressed) forControlEvents:UIControlEventTouchUpInside]; 

    // add existing image, if any, to button 
    if (child.thumbnailImage != nil) { 
     [imageButton setBackgroundImage:child.thumbnailImage forState:UIControlStateNormal]; 
    } 

    // add button to view 
    self.headerView = [[UIView alloc] initWithFrame:CGRectMake(22, 12, 70, 70)]; 
    [headerView addSubview:imageButton]; 

    // add view to table header 
    self.tableView.tableHeaderView = headerView; 

La fuite de mémoire montre sur la ligne alloc ci-dessus pour la headerView UIView. Je déclare le UIView et le UIButton dans le fichier d'en-tête et le libère dans ViewDidUnload et dealloc, donc je ne suis pas sûr de ce que je fais de mal. En outre, cela n'apparaît que sur l'appareil et non sur le simulateur (je voulais juste le mentionner).

Toute aide serait appréciée.

Merci,

Rod

+0

Pouvez-vous poster votre ViewDidUnload? – xil3

Répondre

1

Vous utilisez la méthode setter headerView (self.headerView) si vous avez besoin de libérer l'instance UIView que vous attribuez à la propriété headerView, soit en utilisant release ou autorelease.

par exemple.

UIView* newHeaderView = [[UIView alloc] initWithFrame...]; 
self.headerView = newHeaderView; 
[newHeaderView release]; 

ou

self.headerView = [[[UIView alloc] initWithFrame:...] autorelease]; 

La raison en est que la méthode setter headerView conserve automatiquement l'objet qui lui est attribué.

Alternativement, vous pouvez définir la variable d'instance headerView directement, sans utiliser la méthode setter de propriété:

[headerView release]; // release any existing object 
headerView = [[UIView alloc] initWithFrame:...];