2012-11-16 114 views
2

我试图在用户点击UIAlertview上的按钮后用手机应用程序拨号。手机应用程序确实打开,但点击UIAlertview上的按钮后,原来的应用程序立即崩溃。有谁知道原因?我确实试图确保我发布了应该发布的所有内容。谢谢!下面是代码:iOS应用程序在点击UIAlertview上的按钮后崩溃

-(IBAction)dialButtonPressed:(UIButton *)numberButton 
    { 
    if ([company isEqualToString:@"Not Found"]==true){ 
      message = [[UIAlertView alloc] initWithTitle:@"Sorry" 
                   message:@"No replace number found. Would you like to dial anyway?" 
                  delegate:self 
                cancelButtonTitle:@"No" 
                otherButtonTitles:@"Yes", nil]; 
      message.tag = 0; 
      if(phoneLinkString) 
      { 
       [phoneLinkString release]; 
       phoneLinkString = nil; 
      } 
      [message show]; 
      [message autorelease]; 
      phoneLinkString = [[NSString stringWithFormat:@"tel:%@",replace]retain]; 


     } 
    } 

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
    { 
     NSString *title = [alertView buttonTitleAtIndex:buttonIndex]; 
     [self release]; 

     message = nil; 


     if(message.tag == 0 && buttonIndex == 1){ 
      NSURL *phoneLinkURL = [NSURL URLWithString:phoneLinkString]; 
      [[UIApplication sharedApplication] openURL:phoneLinkURL]; 
     } 

- (void)dealloc { 
    [phoneNumberString release]; 
    [phoneNumberLabel release]; 
    [self release]; 
    [message release]; 
    [super dealloc]; 
} 

最新的代码

-(IBAction)dialButtonPressed:(UIButton *)numberButton 
      { 
      if ([company isEqualToString:@"Not Found"]==true){ 
        message = [[UIAlertView alloc] initWithTitle:@"Sorry" 
                     message:@"No replace number found. Would you like to dial anyway?" 
                    delegate:self 
                  cancelButtonTitle:@"No" 
                  otherButtonTitles:@"Yes", nil]; 
        message.tag = 1; 
        if(phoneLinkString) 
        { 
         [phoneLinkString release]; 
         phoneLinkString = nil; 
        } 
        [message show]; 
        [message autorelease]; 
        phoneLinkString = [[NSString stringWithFormat:@"tel:%@",replace]retain]; 


       } 
     } 
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
     { 

      if(message.tag == 1 && buttonIndex == 1){ 

       NSURL *phoneLinkURL = [NSURL URLWithString:phoneLinkString]; 
       [[UIApplication sharedApplication] openURL:phoneLinkURL]; 
       message = nil; 
      } 
     } 
- (void)dealloc { 
      [phoneNumberString release]; 
      [phoneNumberLabel release]; 
      [super dealloc]; 
     } 

但点击UIAlertView中的按钮后,它仍然坠毁。错误是0x3beb85b0:ldr r3,[r4,#8] EXC_BAD_ACCESS(代码= 1,地址= 0x7269634f)任何帮助,将不胜感激。谢谢!

+0

您的项目是否使用ARC? – rockstarberlin

+0

从任何地方移除'[self release]'并尝试 –

+0

@rockstarberlin如果您看到代码调用'retain','release'或'autorelease',那么项目不能使用ARC。 – rmaddy

回答

3

问题可能是您在if语句之前将警报设置为零。尝试把它放在后面。

+0

在'if'语句之前将'message'设置为'nil'不会导致崩溃。这仍然是错误的,但不会导致崩溃。 – rmaddy

+0

紧急你,你节省了我的时间:) –

2

您的崩溃是由内存管理不善造成的。主要问题是呼叫[self release]。这是非常罕见的情况,这是适当的。

另一个问题是,在将message设置为nil后,您试图检查message.tag。调用nil对象上的tag属性总是会导致值为0.

您的dealloc方法是错误的。不要拨打[self release]。因为您在显示时自动释放它,请勿拨打[message release]

顺便说一句 - 从不使用tag = 0.这是默认设置。如果您想使用tag,请始终使用非零值,以便可以将该值与默认值区分开来。

+0

我现在如何在ios上发布用户? –

3

由于此代码,崩溃正在发生。 [self release];。 当您致电selfrelease显示警报的视图将被释放并释放,而不是alertView。这是导致崩溃的原因。

您已经使用[message autorelease];

所以没必要在clickedButtonAtIndex再次释放alertView的dialButtonPressed:方法释放alertViews内存。因此改变方法如下:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    NSString *title = [alertView buttonTitleAtIndex:buttonIndex]; 
    if(alertView.tag == 0 && buttonIndex == 1) 
    { 
     NSURL *phoneLinkURL = [NSURL URLWithString:phoneLinkString]; 
     [[UIApplication sharedApplication] openURL:phoneLinkURL]; 
    } 
    message = nil; 
} 
+0

仍然崩溃? –

+0

这对我有效。我加了alertview = nil;和[alertView发布];在我的clickedButtonAtIndex方法中,它解决了我的问题。多谢,伙计! – ryryan

+0

很高兴:-) –