2010-10-13 7 views
0

J'ai un problème avec une création de chaîne et une comparaison qui semble perdre son contenu. À l'heure actuelle, j'ai ceci:perdre ma chaîne

switch (creditPos) 
{ 
    case 0: 
     [creditCart.faceImage setImage:[NSString stringWithFormat:@"%@credits_face1.png", _director.platformPrefix]]; 
     break; 
    case 1: 
     [creditCart.faceImage setImage:[NSString stringWithFormat:@"%@credits_face2.png", _director.platformPrefix]]; 
     break; 
    case 2: 
     [creditCart.faceImage setImage:[NSString stringWithFormat:@"%@credits_face3.png", _director.platformPrefix]]; 
     break; 
    case 3: 
     [creditCart.faceImage setImage:[NSString stringWithFormat:@"%@credits_face4.png", _director.platformPrefix]]; 
     break; 
    case 4: 
     [creditCart.faceImage setImage:[NSString stringWithFormat:@"%@credits_face5.png", _director.platformPrefix]]; 
     break; 
    default: 
     break; 
} 

faceImage est un objet que j'ai créé et à l'intérieur de la fonction pour setImage je ...

- (void)setImage:(NSString *)inImageName { 

NSLog(@"Before Break"); 

// By default set the scale to 1.0f and the filtering to GL_NEAREST 
if(![imageName isEqualToString:inImageName]) 
{ 
    NSLog(@"Hit");} 

Le problème que je vais avoir est que lorsque je passe la chaîne utilisant le NSString stringWithFormat, il fonctionnera peut-être 5-8 fois avant d'embêter d'une manière ou d'une autre et d'envoyer quelque chose de complètement aléatoire à la place à la fonction comme -36.657.

Comment est-ce possible? Rien dans les paramètres ne change car _director.platformPrefix est défini au début du programme et n'a jamais été modifié. La seule chose qui change est creditPos à sélectionner avec une chaîne pour créer + passer à la fonction. D'une façon ou d'une autre, la chaîne créée est juste du charabia après quelques itérations et en essayant de la comparer à la dernière chaîne passée dans le code, sans que l'erreur soit renvoyée.

Aide :(

+1

Psst. Vous pouvez également écrire ceci comme une ligne de code: '[creditCart.faceImage setImage: [NSString stringWithFormat: @"% @ crédits_face% d.png ", _director.platformPrefix, (creditPos + 1)]];' –

Répondre

-1

Vous pouvez essayer d'allouer la chaîne car cela peut être un problème de libération automatique.

NSString *myString = [[NSString alloc] initWithFormat:@"%@credits_face%d.png",_director.platformPrefix, creditPos+1]; 
[creditCart.faceImage setImage:myString]; 

Ensuite, la méthode setImage libère la chaîne.

+0

Cela ne va probablement pas aider parce que '_director.platformPrefix' a le problème autorelease pas la chaîne nouvellement créée. En dehors de cela, il est préférable de paramétrer la chaîne à la place de l'instruction switch laide. –

+0

[NSString stringWithFormat:] renvoie également une nouvelle chaîne d'autoreleased. – Ben

+0

Merci Ben, j'ai ajouté un retain à inImageName quand je l'ai assigné à imageName et c'est corrigé pour l'instant. Edit: A la place, vous avez utilisé votre ligne alloc NSString et vous n'avez pas besoin de la conserver. Merci d'autant plus. – user355622

0

Sons comme l'une des chaînes a été dealloced entre les deux. Peut-être un sur la libération ou ne réagissant pas correctement aux avertissements de mémoire ou viewDidUnload.

Pour des fins de débogage, essayez de conserver _director.platformPrefix et Si le problème disparaît, vous avez en effet un problème retainCount: dans près de 99% des cas, la solution finale n'est pas de le conserver, mais de trouver le code qui le libère à tort: ​​

0

Comment attribuez-vous inImageName à imageName Si vous n'utilisez pas de propriété et vous ne retenez pas, votre chaîne inImageName récupère le garbage. La méthode stringWithFormat renverra une chaîne autoreleased qui sera nettoyée automatiquement à moins que vous la conserviez.

Ou créer dans votre tête:

@property (nonatomic, retain) NSString *imageName; 

et dans votre mise en œuvre:

@synthesize imageName; 

Ou, ajoutez un [inImageName retain]; là quelque part quand vous l'assigner à imageName. (Assurez-vous juste de libérer la chaîne imageName avant de l'assigner et dans votre méthode dealloc.)

+0

J'utilisais : @property (non atomique, en lecture seule) NSString * imageName; pour empêcher tout paramètre de imageName. Sous l'instruction if pour vérifier si les chaînes étaient égales, j'ai simplement eu imageName = inImageName. à la place, j'ai maintenant imageName = [inImageName retain]; et cela l'a corrigé, merci pour le heds up à propos de stringWithFormat retournant une chaîne autoreleased. – user355622

0

Je suis d'accord avec Ortwin; il semble que platformPrefix n'est pas correctement conservé, et il parvient à rester intact pendant un peu avant d'être écrasé.

Questions connexes