2010-03-29 2 views
0

J'ai créé un sélecteur que mes utilisateurs peuvent choisir dans une liste de pays. Le problème est que l'ouverture et la fermeture répétées du sélecteur entraîne une erreur "EXC_BAD_ACCESS". Je soupçonne que ce pourrait être une fuite de mémoire mais je ne suis pas sûr. J'espérais que quelqu'un pourrait donner un aperçu de la raison pour laquelle cela pourrait se produire?iPhone SDK: fuite de mémoire sur le sélecteur

//data source for UIPicker 
NSArray *arrayCountryChoices; 



arrayCountryChoices = [[NSArray alloc] initWithObjects:@"TK=TOKELAU", 
          @"TJ=TAJIKISTAN", 
          @"TH=THAILAND", 
          @"TG=TOGO", 
          @"TF=FRENCH SOUTHERN TERRITORIES", 
          @"GY=GUYANA", 
          @"TD=CHAD", nil]; 

//opening the picker 
     CountryViewController *countryVC = [[CountryViewController alloc] initWithNibName:@"CountryView" bundle:nil]; 
     countryVC.delegate = self;  
     [self presentModalViewController:countryVC animated:YES];  
     [countryVC release];  

//here is where I grab the data 
    //close country selector 
    [self dismissModalViewControllerAnimated:YES]; 

    //parse out code 
    NSString *strCode = [chosenCountry substringToIndex:2]; 

    //set the gui 
    txtCountry.text = strCode; 

Je pense que c'est peut-être parce que j'essaye de libérer le sélecteur de pays avant que le délégué ait une chance d'obtenir ses données? Aussi je me demande si je ne devrais pas libérer le sélecteur jusqu'à ce que l'écran qui l'appelle soit libéré.

Merci d'avance.

+0

Quelle ligne de code génère l'EXC_BAD_ACCESS? C'est une information importante. – TechZen

Répondre

0

La publication de l'affichage après l'avoir ajouté en tant que vue modale n'est pas un problème car elle est conservée dans la propriété modalViewController de viewController. Cependant, lorsque vous fermez la vue modale, il disparaît de la sorte, ce message:

NSString *strCode = [chosenCountry substringToIndex:2]; 

... n'a pas de cible/destinataire. Vous devez simplement déplacer cette ligne vers la ligne avant de fermer modalView afin que l'objet chosenCountry soit toujours actif lorsque le message est envoyé.

+0

Je n'ai pas mentionné que plus d'un contrôleur de vue modale est appelé depuis cette vue unique. Par conséquent, je ne pense pas pouvoir compter sur la propriété mainViews modalViewController. – dev

+0

La propriété modalViewController ne contient que la vue modale utilisée pour le moment. Vous ne "comptez pas" sur cela, il arrive juste dans le cadre de la fonction normale des contrôleurs de vue. Mon point était qu'une fois que vous avez rejeté une vue modale, le contrôleur la supprime de sa propre propriété modalViewController et la vue modale se désaffecte ensuite. Par conséquent, vous devez extraire toutes les informations de la vue avant de les ignorer. – TechZen

+0

Le problème était que je rejetais le contrôleur modal avant que le rappel soit appelé. Il est significatif que j'ai plus d'un contrôleur modal pour ce contrôleur de vue. Dans ce cas, la première réponse suggérée ne s'applique pas. En particulier cette partie, "Libérer la vue après l'avoir ajoutée en mode modal n'est pas un problème car elle est conservée dans la propriété modalViewController de viewController". Dans cette situation, je ne peux pas compter sur cette prémisse pour gérer ma gestion de la mémoire pour moi. Dès que j'ai arrêté de relâcher le contrôleur de vue modale après l'avoir créé, tout va bien. – dev