2012-11-16 159 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

很高興:-) –