0

J'ai un problème très étrange lors de l'utilisation de ce UIAlertView. Lorsque vous consultez un médecin, ils ont plusieurs bureaux. En sélectionnant un, vous obtenez une alerte qui vous propose d'appeler cet emplacement ou de l'afficher sur une carte. Pour créer l'alerte et avoir des données à portée de main lorsque l'alerte est rejetée, j'ai déclaré 4 NSStrings (bien que je n'ai probablement besoin que de 2) dans le fichier d'en-tête. (alertTitle, alertText, alertNumber et alertAddress)Problème avec NSStrings et UIAlertView

Lorsque vous examinez le code, le problème est l'endroit où alertAddress est impliqué. Gardez également alertNumber à l'esprit. J'ai eu beaucoup de ce code condensé, mais l'ai élargi pour m'aider à trouver le problème!

-(IBAction)address1ButtonPressed:(id) sender { 
     Formatter *pnf = [Formatter alloc]; 
     alertTitle = [physician objectForKey:ADDRESS1DESC_KEY]; 
     NSString *a = [physician objectForKey:ADDRESS1A_KEY]; 
     NSString *b =[physician objectForKey:ADDRESS1CITY_KEY]; 
     NSString *c =[physician objectForKey:ADDRESS1STATE_KEY]; 
     NSString *d = [physician objectForKey:ADDRESS1ZIP_KEY]; 
     NSString *p = [physician objectForKey:PHONE1A_KEY]; 
     alertAddress = [[NSString stringWithFormat:@"http://maps.google.com/maps?q=%@,+%@,+%@+%@",a,b,c,d] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
     NSLog(@"%@",alertAddress); 
     alertText = [NSString stringWithFormat:@"%@\n%@, %@ %@\n%@",a,b,c,d,[pnf stringFromPhoneNumber:p]]; 
     alertNumber = [p stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
     [pnf release]; 
     UIAlertView *phoneAlert = [[UIAlertView alloc] initWithTitle:alertTitle message:alertText delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Call",@"View Map",nil]; 
     [phoneAlert show]; 

     } 

Tout va bien jusqu'à ce que nous atteignions le point où nous gérons le renvoi d'alerte. alertNumber semble très bien, je peux l'utiliser pour déclencher l'appel téléphonique et le connecter à la console. Toutefois, alertAddress n'est pas du tout content de faire la même chose. même en essayant de le connecter à la console provoque un EXC_BAD_ACCESS. alertAddress enregistre correctement les données avant que l'alerte ne soit en cause, mais l'accès à ces données lors de la gestion du bouton d'alerte entraîne un problème. J'ai même utilisé le numéro d'alerte, il est en place et le code fonctionne parfaitement.

Pourquoi les deux mêmes variables NSString se comportent-elles différemment si elles sont utilisées exactement de la même manière?

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex { 
    if (buttonIndex == 1) { 
     NSLog(@"Dialing: %@",alertNumber); 
     [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"tel://%@",alertNumber]]];  
    } 
    if (buttonIndex == 2) { 
     NSLog(@"Map Selected"); 
     NSLog(@"alertAddress contains: %@",alertAddress); 
     [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://maps.google.com/maps?q=%@",alertAddress]]];  
    } 
} 

Voici les déclarations connexes dans le fichier d'en-tête trop ...

@interface PhysicianDetailViewController: UIViewController { 
    ... 
    NSString *alertTitle; 
    NSString *alertText; 
    NSString *alertNumber; 
    NSString *alertAddress; 
... 
} 

@property (nonatomic, retain) NSString *alertTitle; 
@property (nonatomic, retain) NSString *alertText; 
@property (nonatomic, retain) NSString *alertNumber; 
@property (nonatomic, retain) NSString *alertAddress; 
... 

Et est ici la sortie de la console au cours de ce processus, si elle aide ....

> 2010-10-29 11:09:17.954 [2672:307] http://maps.google.com/maps?q=123%20Main%20Street%0ASuite%20A,+Tampa,+FL+11111 
    > 2010-10-29 11:09:21.657 [2672:307] Map Selected 
    > Program received signal: “EXC_BAD_ACCESS”. 
    > kill quit 
+0

-t-il fonctionner si vous utilisez l'accesseur? La cause juste alertAddress est en train d'être définie sur une variable auto-libérée. – blindjesse

+0

Ne devrait-il pas être conservé comme spécifié dans le fichier d'en-tête? Dealloc ne me pose aucun problème quand je vais le publier là-bas. Donc, je ne pense pas qu'il soit autoreleased. Même si je devais mettre alertAddress = @ "BLEH"; il échoue toujours lorsqu'il est accédé via le bouton d'alerte, appuyez sur/ignorer. – TheHockeyGeek

Répondre

1

Utilisez setter pour que l'instance soit conservée. N'oubliez pas de le relâcher lorsque vous n'en avez plus besoin.

self.alertAddress = [[NSString stringWithFormat:@"http://maps.google.com/maps?q=%@,+%@,+%@+%@",a,b,c,d] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

Faites de même avec d'autres propriétés.

L'autre chose est qu'il semble que vous ayez fuite de mémoire:

UIAlertView *phoneAlert = [[UIAlertView alloc] initWithTitle:alertTitle message:alertText delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Call",@"View Map",nil]; 
[phoneAlert show]; 
//add release after showing alert 
[phoneAlert release]; 
+0

Je suis toujours confus avec l'utilisation d'un setter ... mais ça fonctionne à coup sûr. Merci – TheHockeyGeek

+0

Je suppose que j'aurais dû soumettre mon commentaire précédent comme réponse ... Quoi qu'il en soit, la propriété définie pour la variable de classe n'est utilisée que si vous utilisez le setter (self.alertAddress =). Sinon, la variable est définie directement, donc vous devrez ajouter manuellement une retenue à la fin (ce qui est quelque peu bâclé). J'espère que cela t'aides – blindjesse