2012-05-01 2 views
-1

Possible en double:
EXC_BAD_ACCESS when trying to get iPhone screen dimensionsObjective-C: Réception "EXC_BAD_ACCESS" Signal

Je l'extrait de code de code suivant dans Objective-C qui définit automatiquement certaines variables à un certain nombre de paramètres prédéfinis . Cependant, sur la ligne marquée, j'obtiens une exception "Program received signal: EXC_BAD_ACCESS". Ce qui me rend confus, c'est que la ligne ci-dessus est identique, juste avec une valeur différente. Si la ligne 1 ne lance pas d'exception, pourquoi la ligne 2? Que puis-je faire à ce sujet?

Merci d'avance!

Sterren

- (IBAction)presetPressed:(id)sender { 
    if(self.userEnteringNumber) [self enterPressed]; 

    double xVal; 
    double aVal; 
    double bVal; 
    NSString *preset = [sender currentTitle]; 
    if ([preset isEqualToString:@"1"]) { 
     xVal = 1; 
     aVal = 2; 
     bVal = 3; 
    } else if ([preset isEqualToString:@"2"]) { 
     xVal = 1.5; 
     aVal = 2.9; 
     bVal = 3.0; 
    } else if ([preset isEqualToString:@"3"]) { 
     xVal = -1; 
     aVal = -2; 
     bVal = -3; 
    } 
    [self.variables setValue:[NSNumber numberWithDouble:xVal] forKey:@"x"]; 
    [self.variables setValue:[NSNumber numberWithDouble:aVal] forKey:@"a"]; 
    [self.variables setValue:[NSNumber numberWithDouble:bVal] forKey:@"b"]; 

    self.xVar.text = [NSString stringWithFormat:@"= %@", xVal]; 
    self.aVar.text = [NSString stringWithFormat:@"= %@", aVal]; //EXC_BAD_ACCESS here 
    self.bVar.text = [NSString stringWithFormat:@"= %@", bVal]; 

    [self calculateResult]; 
} 
+0

Merci, cela résout mon problème. Une partie de la question est liée à la raison pour laquelle cela fonctionne pour la première déclaration mais pas la seconde. En outre, toutes les 3 déclarations arrivent à fonctionner quand preset == "1". Si% @ est supposé fonctionner uniquement pour les objets et non pour les primitives, pourquoi cela marche-t-il parfois et parfois non? – Steztric

+0

Merci les répondants! Votre aide est grandement appréciée. Vos deux solutions, T Reddy et Till, sont excellentes. Cependant, armé de l'information que% @ est pour les objets, j'ai décidé pour la solution suivante; self.xVar.text = [NSString stringWithFormat: @ "=% @", [NSnumber numberWithDouble: xVal]]; Cela garantit que le texte dans xVar est bien formaté sans zéros de fin inutiles. – Steztric

Répondre

1

xVal, aVal, bVal sont toutes doubles primitives, mais encore le format de votre chaîne est à la recherche d'un objet via %@.

essayez de remplacer %@ avec %f (ou %g si vous préférez la notation scientifique):

self.xVar.text = [NSString stringWithFormat:@"= %f", xVal]; 
    self.aVar.text = [NSString stringWithFormat:@"= %f", aVal]; 
    self.bVar.text = [NSString stringWithFormat:@"= %f", bVal]; 
+0

Merci T_Reddy. Vous avez répondu sans préjugé. Je m'excuse que je suis nouveau à l'objectif-c pour le reste d'entre vous et que parfois je ne pose pas les bonnes questions. – Steztric

1

Remplacez vos chaînes de formatage @"= %@" avec @"= %g". Votre chaîne de formatage supposait que la valeur de paramètre donnée serait une instance d'objet (%@) mais vous fournissiez une double valeur scalaire qui n'est pas une instance d'objet mais un type primitif.

Questions connexes