2011-12-29 198 views
0

我有一个字符串声明为这种如何更新一个字符串变量与另一个字符串变量

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]]]; 

我宣布一个全局变量

NSStrinng *tweetString 

,并希望将字符串str中复制到tweetString 。我应该如何复制它?因为两者都是三分球,我想:

tweetString = str; 

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

但它合乎理工作。


编辑: 我的代码:

-(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: 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: 我tweetString声明鉴于或者Controller.h作为

@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

这两个任务应该工作。它以什么方式不起作用?编译错误? – 2011-12-29 01:13:33

+0

嗨mattias,我有一段我的代码加上我收到的错误的帖子.. – at0m87 2011-12-29 01:23:38

+0

这是作业,是吗? – 2011-12-29 01:32:06

回答

0

它不起作用的原因(它可能与EXC_BAD_ACCESS崩溃)是因为变量str的范围只在声明的块内,if/else语句的else部分的块。试试这样:

-(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

谢谢你的帮助。其他的东西仍然不正确。我在所有if和else语句之外都有tweetShring = [str copy],但代码仍然以相同的错误结束。 – at0m87 2011-12-29 02:01:17

+0

这不是你唯一需要改变的事情。你需要在if/else之外声明变量str,就像我在我的例子中所说的那样。阅读我的代码中的所有评论,你就会明白我在说什么。 – 2011-12-29 02:05:13

+0

RIckay我设法通过了那个错误!我删除了所有行中的“NSString”NSString * str = ... 它似乎是额外的声明是一个NSString导致问题=)))现在我的日志可以打印出tweetString =)字符串) ) – at0m87 2011-12-29 02:15:16

0

如果你想复制字符串,或者在分配字符串后使用字符串,你需要复制它或者保留它。

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

在几秒钟内,这两个字符串将是零或其他非值。你必须做的是:

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

通过这样做,你会保持这两个变量在内存中,只要他们是可行的。但在我看来,一个更好的办法,用绳子尤其是在处理时是使用复制,就像这样:

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

这将使someString走开在几秒钟或时钟滴答,但copiedString将生活,直到功能完成或班级发布。

我怀疑你没有得到tweetString中的字符串值,因为当你想使用它时,这两个变量都从内存中消失了。

如果你需要一个变量留下来,你必须复制或保留它。

+0

我明白你的观点。试图在其后添加副本。仍然失败。我认为这个问题可能在别的地方。检查我的编辑上面的调试器打印出来。 – at0m87 2011-12-29 01:55:55

相关问题