как обновить строковую переменную другой строковой переменной - PullRequest
0 голосов
/ 29 декабря 2011

у меня есть строка, объявленная как таковая

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

но это действительно работает.


EDIT: мой код:

-(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: Вывод отладчика:

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 объявлен в view 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 голосов
/ 29 декабря 2011

Если вы хотите скопировать строку или использовать строку после ее назначения, вам необходимо либо скопировать ее, либо сохранить ее.

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 голосов
/ 29 декабря 2011

Причина, по которой он не работает (возможно, происходит сбой EXC_BAD_ACCESS), заключается в том, что область видимости переменной str находится только в блоке, в котором она объявлена, в блоке else вашей части if / 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];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...