2009-04-13 5 views
1

J'ai des problèmes avec NSString dans mon application. Fondamentalement, j'ai un NSString appelé o1string qui contient la valeur "602". Je veux sortir ceci dans un UIAlertView avec un autre texte.NSString contient un nombre, pourquoi plante-t-il mon application?

votedmessage = [ NSString stringWithFormat:@"The current standings are as follows:\n\n%@: %@ votes", b1title, o1string ]; 
UIAlertView *votedAlert = [[UIAlertView alloc] initWithTitle:@"Thank you for voting" message:votedmessage delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil]; 

Je l'ai utilisé NSLog et vérifié que la valeur à l'intérieur du NSString est certainement 602, et l'autre variable (b1title) utilisé dans le message émet bien lui-même. Je n'arrive pas à comprendre pourquoi l'application plante quand j'ajoute la variable o1votes au message d'alerte, est-ce que cela a quelque chose à voir avec un conflit en ne tenant qu'un nombre dans un NSString?

Voici comment la fonction o1string est définie. Il contient définitivement "602", saisi à partir d'un fichier XML.

o1string = [[options objectAtIndex:3] objectForKey: @"votes"]; 
o1string = [o1string stringByReplacingOccurrencesOfString:@"\n" withString:@""]; 
o1string = [o1string stringByReplacingOccurrencesOfString:@" " withString:@""]; 
+0

Il n'y a pas de variable o1votes dans le code que vous avez publié. Postez le code où la variable est affectée et comment elle est utilisée. – Chuck

+0

Désolé, je voulais dire o1string. Message original mis à jour. – FishFingers

+0

Ils sont tous NSStrings. Je les ai testés tous les deux. J'ai mis le titre UIAlertView à être o1string et il s'est écrasé, mais quand je l'ai placé à b1title (qui est également un NSString peuplé avec des données exactement de la même manière) il a fonctionné comme prévu. – FishFingers

Répondre

6

À moins que la cession de o1string est dans la même méthode où votedmessage est créé (puisque vous ne dites pas, je suppose pas), il sera parti au moment où vous arrivez au code où votedmessage en a besoin À moins que vous n'utilisiez la récupération de place, vous devez conserver les objets que vous souhaitez conserver après la méthode en cours. Voir le Objective-C memory management guide pour tous les détails.

+0

Il n'est pas défini dans la même méthode, mais il est placé au même endroit que b1title, ce qui fonctionne bien. Les deux sont initialement déclarés dans le fichier d'en-tête. – FishFingers

+0

Si b1title est défini de la même manière et que cela fonctionne, alors vous avez de la chance, car votre code est erroné. – Chuck

+0

+1 Je pense que la variable est en cours de publication avant la création de l'alerte. – Jab

0

Vous devez poster plus de code. En particulier, il n'est pas clair si les deux pièces que vous avez postées sont dans la même fonction ou dans des endroits différents.

Si elles se trouvent à des endroits différents, vous devez appeler [O1string retain] (et plus tard [O1string release]). La façon la plus simple de le faire serait de faire de olstring une propriété avec une sémantique de rétention. StringByReplacingOccurrencesOfString renvoie une instance temporaire qui sera automatiquement libérée après l'existence de la fonction.

Je suppose que la raison pour laquelle b1Title fonctionne est qu'il est stocké dans votre dictionnaire, donc il est persistant. o1string est créé à partir des fonctions stringByXXX et est temporaire.

Questions connexes