我有一个字符串声明
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;
答案 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中获取字符串值,因为当你想使用它们时,两个变量都已经从内存中消失了。
如果你需要一个变量来保持,你必须复制或保留它。