2012-11-16 4 views
2

사용자가 UIAlertview에서 버튼을 클릭하면 전화 앱으로 전화를 걸려고했습니다. 전화 앱이 열렸지만 UIAlertview의 버튼을 클릭하면 원래 앱이 추락했습니다. 아무도 이유를 알고 있습니까? 내가 풀어야 할 모든 것을 공개했는지 확인하려고 했어. 감사! 아래는 코드입니다UIAlertview에서 버튼을 클릭 한 직후에 iOS 앱이 추락했습니다.

-(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 문 앞에 알림을 nil로 설정하는 것이 문제 일 수 있습니다. 그것을 후에 시험해보십시오.

+0

'if' 문 앞에'message'를'nil'으로 설정해도 충돌을 일으키지 않습니다. 여전히 잘못되었지만 충돌을 일으키지 않았습니다. – rmaddy

+0

Thnk, 내 시간을 절약하십시오 :) –

2

메모리 관리가 잘못되어 충돌이 발생합니다. 주요 문제는 [self release]입니다. 이것이 아주 적절한 경우입니다.

또 다른 문제는 messagenil으로 설정 한 직후 message.tag을 확인하려는 것입니다. nil 개체에서 tag 속성을 호출하면 항상 값이 0이됩니다.

dealloc 메서드가 모두 잘못되었습니다. [self release]으로 전화하지 마십시오. 당신이 그것을 보여줬을 때 자동 번역 한 이후로 [message release]으로 전화하지 마십시오.

BTW - tag을 사용하지 마십시오. 기본값입니다. tag을 사용하려면 기본값과 값을 구별 할 수 있도록 항상 0이 아닌 값을 사용하십시오.

+0

어떻게하면 사용자를 지금 ios에서 릴리스 할 수 있습니까? –

3

이 코드로 인해 충돌이 발생했습니다. [self release];. selfrelease으로 전화하면 경고가 표시되는보기가 해제되고 해제되며 alertView는 해제되지 않습니다. 그것이 충돌의 원인입니다.

당신은 이미 clickedButtonAtIndex에 다시 alertView를 해제 [message autorelease];

그래서 필요를 사용하지 않는 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 release]; 내 clickedButtonAtIndex 메서드에서 내 문제를 해결했습니다. 고마워 친구! – ryryan

+0

즐거움 :-) –

관련 문제