2010-10-29 107 views
0

当使用这个UIAlertView时,我有一个很奇怪的问题。在看医生时,他们有几个办公室。选择一个后,你会看到一个警报,可以调用这个位置或者在地图上显示它。要创建警报并在警报解除时准备好数据,我在头文件中声明了4个NSString(尽管我可能只需要2个)。 (alertTitle,alertText,alertNumber和alertAddress)NSString和UIAlertView有问题

查看代码时,问题是涉及到alertAddress的位置。还要记住alertNumber。我有很多这样的代码被压缩了,但是已经扩展了它来帮助我自己找到问题!

-(IBAction)address1ButtonPressed:(id) sender { 
     Formatter *pnf = [Formatter alloc]; 
     alertTitle = [physician objectForKey:ADDRESS1DESC_KEY]; 
     NSString *a = [physician objectForKey:ADDRESS1A_KEY]; 
     NSString *b =[physician objectForKey:ADDRESS1CITY_KEY]; 
     NSString *c =[physician objectForKey:ADDRESS1STATE_KEY]; 
     NSString *d = [physician objectForKey:ADDRESS1ZIP_KEY]; 
     NSString *p = [physician objectForKey:PHONE1A_KEY]; 
     alertAddress = [[NSString stringWithFormat:@"http://maps.google.com/maps?q=%@,+%@,+%@+%@",a,b,c,d] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
     NSLog(@"%@",alertAddress); 
     alertText = [NSString stringWithFormat:@"%@\n%@, %@ %@\n%@",a,b,c,d,[pnf stringFromPhoneNumber:p]]; 
     alertNumber = [p stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
     [pnf release]; 
     UIAlertView *phoneAlert = [[UIAlertView alloc] initWithTitle:alertTitle message:alertText delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Call",@"View Map",nil]; 
     [phoneAlert show]; 

     } 

一切都很好,直到我们到达处理警戒解雇的地步。 alertNumber似乎遇到了很好,我可以用它来触发电话并将其登录到控制台。

但是,alertAddress并不乐意做同样的事情。即使尝试将其记录到控制台也会导致EXC_BAD_ACCESS。 alertAddress在涉及警报之前正确记录数据,但在处理警报按钮解除时访问此数据会导致问题。我甚至使用alertNumber它是地方和代码完美的功能。

为什么两个完全相同的NSString变量在使用完全相同的方式时行为如此不同?

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex { 
    if (buttonIndex == 1) { 
     NSLog(@"Dialing: %@",alertNumber); 
     [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"tel://%@",alertNumber]]];  
    } 
    if (buttonIndex == 2) { 
     NSLog(@"Map Selected"); 
     NSLog(@"alertAddress contains: %@",alertAddress); 
     [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://maps.google.com/maps?q=%@",alertAddress]]];  
    } 
} 

下面是在头文件过相关声明...

@interface PhysicianDetailViewController: UIViewController { 
    ... 
    NSString *alertTitle; 
    NSString *alertText; 
    NSString *alertNumber; 
    NSString *alertAddress; 
... 
} 

@property (nonatomic, retain) NSString *alertTitle; 
@property (nonatomic, retain) NSString *alertText; 
@property (nonatomic, retain) NSString *alertNumber; 
@property (nonatomic, retain) NSString *alertAddress; 
... 

这里是在这个过程中是否有帮助控制台输出....

> 2010-10-29 11:09:17.954 [2672:307] http://maps.google.com/maps?q=123%20Main%20Street%0ASuite%20A,+Tampa,+FL+11111 
    > 2010-10-29 11:09:21.657 [2672:307] Map Selected 
    > Program received signal: “EXC_BAD_ACCESS”. 
    > kill quit 
+0

请问,如果你使用的存取工作的呢?只是让alertAddress被设置为一个自动发布的变种。 – blindjesse 2010-10-29 15:45:41

+0

不应该像头文件中指定的那样保留它吗?当我在那里发布它时,Dealloc不会给我任何问题。所以我不认为它被自动释放。即使我要把alertAddress = @“BLEH”;当通过按下/关闭提醒按钮进行访问时,它仍然失败。 – TheHockeyGeek 2010-10-29 15:53:43

回答

1

使用setter,所以实例将被保留。当你不再需要它时,请记住释放它。

self.alertAddress = [[NSString stringWithFormat:@"http://maps.google.com/maps?q=%@,+%@,+%@+%@",a,b,c,d] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 

与其他属性一样。

的另一件事是,它似乎你有内存泄漏:

UIAlertView *phoneAlert = [[UIAlertView alloc] initWithTitle:alertTitle message:alertText delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Call",@"View Map",nil]; 
[phoneAlert show]; 
//add release after showing alert 
[phoneAlert release]; 
+0

我仍然对使用二传手感到困惑......但它确实有效。谢谢 – TheHockeyGeek 2010-10-30 03:33:00

+0

我想我应该提交我以前的评论作为答案......无论如何,只有在使用setter(self.alertAddress =)时才会使用类变量的定义属性。否则,该变量是直接设置的,所以你将不得不手动添加一个保留到最后(这是有点草率)。希望这可以帮助 – blindjesse 2010-10-30 03:49:30