如何使用另一个字符串变量更新字符串变量

时间:2011-12-29 01:08:47

标签: iphone ios string variables global

我有一个字符串声明

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;

2 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分:0)

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

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

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

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

通过这样做,只要它们可行,您就会将两个变量保留在内存中。但在我看来,更好的方法,特别是在处理字符串时,使用copy,就像这样:

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

这会使someString在几秒钟或时钟滴答声中消失,但复制串将继续存在,直到函数完成或类发布。

我怀疑你没有在tweetString中获取字符串值,因为当你想使用它们时,两个变量都已经从内存中消失了。

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