2 votes

L'utilisation de loadNibNamed laisse une fuite de mémoire

Pour une raison quelconque, l'utilisation de loadNibNamed : me laisse avec une fuite de mémoire.

Disons que j'ai les interfaces :

@interface Step : UIViewController
{
  IBOutlet UIView *keyPadPopupView;
}
@property (nonatomic, assign) IBOutlet UIView *keyPadPopupView;

En marche :

@synthesize keyPadPopupView;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
  {
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) 
    {
        [[NSBundle mainBundle] loadNibNamed:@"customNumberKeypad" owner:self options:nil];
        [self.view addSubview:keyPadPopupView];
        [keyPadPopupView release];
    }
    return self;
  }

- (void) dealloc
{
    NSLog(@"dealloc........%@", [self class]);
    [super dealloc];
}

J'effectue l'init en utilisant :

Step *step = [[Step alloc] initWithNibName:@"StepXib" bundle:nil];
[step release]; 

Je n'arrive pas à comprendre pourquoi la méthode dealloc n'est jamais appelée. Dans le Xib, le propriétaire du fichier est Step, et le keyPadPopupView est connecté en IB.

Il y a quelque chose que j'ai manqué ?

Merci !

2voto

vagrant Points 342

Dans iOS, la connexion d'un IBOutlet entraîne la conservation de l'objet (contrairement à OS X). L'ajout d'une vue à une sous-vue entraîne sa conservation. Donc...

Chargement de la plume - +1 (1)

Ajouter comme sous-vue - +1 (2)

libération - -1 (1)

Vous avez toujours une retenue en cours.

Est-ce que viewDidUnload est appelé ? Normalement, à cet endroit, vous libérez toutes les sous-vues conservées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X