2011-12-29 2 views
0

j'ai une chaîne déclarer en tant que tellecomment mettre à jour une variable de chaîne par une autre chaîne de variable

NSString *str = [[NSString alloc] initWithFormat:@"I require an average GPA of at least %.2f to achieve my Goal of %@ this semester - NTU GPA Calculator", pgagoal,(NSString *)[myPickerDelegate.myGoal objectAtIndex: [myPicker selectedRowInComponent:0]]]; 

i déclarais une variable globale

NSStrinng *tweetString 

et veut copier la chaîne dans str tweetString . comment dois-je le copier? puisque les deux sont des pointeurs, j'ai essayé:

tweetString = str; 

ou

tweetString = [NSString stringWithFormat:@"%@", str]; 

mais il travaille DOEST.


EDIT: mon code:

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex1{ 
NSLog(@"buttonindex 1 clicked"); 

NSString *str2; 
NSLog(@"tweetString before if: %@", tweetString); 
if (pgagoal < 0) { 
    NSString *str2 = [[NSString alloc] initWithFormat:@"Confirm, Guarantee, Chop and Stamp! I can achieve my Goal of %@ this semester - NTU GPA Calculator", (NSString *)[myPickerDelegate.myGoal objectAtIndex: [myPicker selectedRowInComponent:0]]]; 
    NSLog(@"tweetString: < 0 %@", str2); 
} 
else if (pgagoal > 5){ 
    NSString *str2 = [[NSString alloc] initWithFormat:@"Its impossible!, i need an average GPA of at least %.2f to achieve %@ this semester - NTU GPA Calculator", pgagoal,(NSString *)[myPickerDelegate.myGoal objectAtIndex: [myPicker selectedRowInComponent:0]]]; 
    NSLog(@"tweetString: >5 %@", str2); 
} 

else{ 
    NSString *str2 = [[NSString alloc] initWithFormat:@"I require an average GPA of at least %.2f to achieve my Goal of %@ this semester - NTU GPA Calculator", pgagoal,(NSString *)[myPickerDelegate.myGoal objectAtIndex: [myPicker selectedRowInComponent:0]]]; 
    NSLog(@"tweetString with else: %@", str2); 
} 

//did i update tweetString correctly? 
tweetString = [NSString stringWithString:str2]; <-- stop working from this point EXC_BAD_ACCESS 

NSLog(@"tweetString after if else: %@", tweetString); 
[self sendEasyTweet:tweetString]; 
NSLog(@"tweetString: %@", tweetString); 
[str2 release]; 
} 

- (void)sendEasyTweet {  
// Set up the built-in twitter composition view controller. 
TWTweetComposeViewController *tweetViewController = [[TWTweetComposeViewController alloc] init]; 


// Set the initial tweet text. See the framework for additional properties that can be set. 
[tweetViewController setInitialText:tweetString]; 

// Create the completion handler block. 
[tweetViewController setCompletionHandler:^(TWTweetComposeViewControllerResult result) {   
    switch (result) { 
     case TWTweetComposeViewControllerResultCancelled: 
      // The cancel button was tapped. 
      NSLog(@"Tweet cancelled"); 
      break; 
     case TWTweetComposeViewControllerResultDone: 
      // The tweet was sent. 
      NSLog(@"Tweet done"); 
      break; 
     default: 
      break; 
    } 

    // Dismiss the tweet composition view controller. 
    [self dismissModalViewControllerAnimated:YES]; 
}]; 

// Present the tweet composition view controller modally. 
[self presentModalViewController:tweetViewController animated:YES]; 
} 

EDIT2: sortie Debbuger:

2011-12-29 09:54:22.963 GPA[487:707] buttonindex 1 clicked 
2011-12-29 09:54:22.966 GPA[487:707] tweetString before if: NTU GPA Calculator <-- i init the string at viewDidLoad 
2011-12-29 09:54:22.968 GPA[487:707] tweetString with else: I require an average GPA of at least 1.56 to achieve my Goal of Third Class Honors this semester - NTU GPA Calculator 
(gdb) 

EDIT3: mon tweetString est déclarée en vue Controller.h comme

@interface GPAMainViewController : UIViewController <GPAFlipsideViewControllerDelegate>{ 
UIPickerView * myPicker; 
GPAAppDelegate * myPickerDelegate; 
IBOutlet UITextField *txtGPA; 
IBOutlet UITextField *txtTotalAU; 
IBOutlet UITextField *txtRemainingAU; 
double pgagoal; 
NSString *tweetString; 
} 

@property (nonatomic, retain) IBOutlet UIPickerView * myPicker; 
@property (nonatomic, retain) IBOutlet GPAAppDelegate *myPickerDelegate; 
@property (nonatomic, retain) UITextField *txtGPA; 
@property (nonatomic, retain) UITextField *txtTotalAU; 
@property (nonatomic, retain) UITextField *txtRemainingAU; 
@property (nonatomic, retain) NSString *tweetString; 

-(IBAction)finishEditing:(id)sender; 
-(IBAction)calculateGoal: (id) sender; 
-(IBAction)showInfo:(id)sender; 
-(IBAction)nextField:(id)sender; 
-(IBAction)resetField:(id)sender; 
-(void)sendEasyTweet:(id)sender; 
+1

Les deux affectations devraient fonctionner. En quoi cela ne fonctionne-t-il pas? compiler l'erreur? –

+0

Salut Mattias, j'ai le poste avec un segment de mon code, plus l'erreur que j'ai reçu .. – at0m87

+0

C'est des devoirs, oui? –

Répondre

0

La raison pour laquelle cela ne fonctionne pas (il est probablement écrasé avec un EXC_BAD_ACCESS) est que la portée de la variable str est seulement dans le bloc dans lequel il est déclaré, le bloc de la partie else de votre instruction if/else . Essayez quelque chose comme ceci:

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex1 { 
    NSString* str; //declare string here so it is in scope the entire method 
    . 
    . //your code 
    . 
    . 

    if(yourConditionHere) { 
     //make sure you initialize str here as well so if the else part of the statement 
     // isn't executed, you aren't trying to access an uninitialized variable 
    } else { 
     str = [[NSString alloc] initWithFormat:@"I require an average GPA of at 
      least %.2f to achieve my Goal of %@ this semester - NTU GPA Calculator", 
      pgagoal,(NSString *)[myPickerDelegate.myGoal objectAtIndex: [myPicker 
      selectedRowInComponent:0]]]; //give str a value 

     NSLog(@"tweetString with else: %@", str); 
    } //Variable str is going out of scope here the way you have your code set up now 

    tweetString = [str copy]; 

    NSLog(@"tweetString after if else: %@", tweetString); 
    [self sendEasyTweet:tweetString]; 
    NSLog(@"tweetString: %@", tweetString); 
    [str release]; 
} 
+0

Merci pour votre aide. quelque chose d'autre n'est toujours pas correct. J'ai le tweetShring = [str copy] en dehors de toute l'instruction if et else mais le code se retrouve toujours avec la même erreur. – at0m87

+0

Ce n'est pas la seule chose que vous devez changer. Vous devez déclarer la variable str en dehors de l'if/else, comme je l'ai dit dans mon exemple. Lisez tous les commentaires dans mon code et vous comprendrez de quoi je parle. –

+0

RIckay j'ai réussi à passer cette erreur! j'ai enlevé le "NSString" de toute la ligne NSString * str = ... il semble que la déclaration supplémentaire de str étant un NSString a provoqué le problème =)) maintenant mon journal pourrait imprimer la chaîne de tweetString =) – at0m87

0

Si vous voulez copier la chaîne, ou utiliser la chaîne après que vous lui attribuez, vous devez soit de le copier ou le conserver.

NSString *someString = @"This is a string"; 
NSString *copiedString = [NSString stringWithFormat:@"%@", someString"]; 

En l'espace de quelques secondes, les deux chaînes seront nulles ou non valables. Ce que vous devez faire est:

NSString *someString = @"This is a string"; 
NSString *copiedString = [NSString stringWithFormat:@"%@", someString"] retain]; 

En faisant cela, vous garderez les deux variables en mémoire tant qu'ils sont viables. Mais à mon avis une meilleure façon, surtout face à des chaînes est d'utiliser une copie, comme ceci:

NSString *someString = @"This is a string"; 
NSString *copiedString = [NSString stringWithFormat:@"%@", someString"] copy]; 

Cela fera someString aller tout de suite en quelques secondes ou les tiques horloge, mais copiedString se perpétuera jusqu'à la la fonction est terminée ou la classe libérée.

Je suppose que vous n'obtenez pas la valeur de chaîne dans tweetString parce que les deux variables ont disparu de la mémoire lorsque vous voulez l'utiliser.

Si vous avez besoin d'une variable pour rester, vous devez la copier ou la conserver.

+0

Je comprends votre point. essayé d'ajouter une copie derrière elle. échoue toujours. Je pense que le problème pourrait être ailleurs. vérifier mon édition ci-dessus pour l'impression du débogueur. – at0m87

Questions connexes