2012-06-06 3 views
1

두 버튼이있는 UIAlertView이 있습니다. 그러나 나는 clickedButtonAtIndex 이벤트를 가져올 수 없습니다. 문제는 - (void)dealloc 메서드가 너무 일찍 호출되어 위임자를 nil로 설정했기 때문입니다. 이로 인해 경고보기 버튼 클릭을 처리 할 수 ​​없었습니다. 이것에 대한 이유는 무엇 일 수 있습니다.Dealloc 메서드가 조기에 호출되는 중

편집 : 내 코드에는 두 가지 방향이 있습니다. 하나의 흐름 방향에, 그것의 일 벌금. dealloc 메서드가 올바른 방법으로 호출되고 있습니다. 초기에 뷰가 해제 될 때 아무런 문제가 없습니다.

그러나 두 번째 흐름에서는이 문제가 발생합니다. 현재로서는 뷰가 중간에 해제되는 경우 UIAlertView 대리자를 [self retain]으로 설정해야한다는 것을 이해합니다. 그러나보기가 해제되었거나 계속 유지되는지 여부를 확인하여 첫 번째 흐름을 방해하지 않는 방법은 무엇입니까?

코드의 관련 부분을 게시하려고합니다. 나는 이것이 뷰가 할당 해제 된 곳이라고 생각한다.

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{ 
    if(actionSheet.tag == 102) 
    { 
     if(buttonIndex == 0) 
     { 
      [self.infoView removeFromSuperview]; 
      self.isSaveInfo = NO; 
      [self.doneButton.target performSelector:self.doneButton.action withObject:self.doneButton.target]; //This is where the view is getting released. 

      if([[NSBundle mainBundle] loadNibNamed:@"UploadView" owner:self options:nil]) 
      { 
       [self.uploadView setFrame:CGRectMake(0, 0, 320, 480)]; 

       [[UIApplication sharedApplication].keyWindow addSubview:self.uploadView]; 
      } 
      [self performSelector:@selector(RemoveView) withObject:nil afterDelay:3.0]; 
     } 

     if(buttonIndex == 1) 
     { 
      [self.infoView removeFromSuperview]; 
      self.isSaveInfo = YES; 

      [[NSNotificationCenter defaultCenter] removeObserver:self]; 
      [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loadSaveButton) name:@"callThisMethod" object:nil]; 

      MyInfoViewController *myInfoViewController = [[MyInfoViewController alloc]initWithNibName:@"MyInfoViewController" bundle:nil]; 
      self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:nil action:nil] autorelease]; 
      [self.navigationController myInfoViewController animated:YES]; 
      [myInfoViewController release]; 
     } 
    } 
} 


-(void)RemoveView 
{ 
    if([MyViewController OnSave]) 
    { 
     self.testAlert = [[[ UIAlertView alloc]initWithTitle:messageTitle message:messageBody delegate:self cancelButtonTitle:messageClose otherButtonTitles:nil]autorelease]; 
     self.testAlert.tag = 1; 
     [self.testAlert show]; 
     [MyViewController setValue:NO]; 
    } 
    else 
    { 
     self.testAlert = [[[ UIAlertView alloc]initWithTitle:messageTitle message:messageBody delegate:self cancelButtonTitle:messageClose otherButtonTitles:messageTryAgain, nil]autorelease]; 
     self.testAlert.tag = 2; 
     [self.testAlert show]; 
    } 
} 

-(void)loadSaveButton 
{ 
    [doneButton.target performSelector:doneButton.action]; 

    if([[NSBundle mainBundle] loadNibNamed:@"UploadView" owner:self options:nil]) 
    { 
     [self.uploadView setFrame:CGRectMake(0, 0, 320, 480)]; 
     [[UIApplication sharedApplication].keyWindow addSubview:self.uploadView]; 

    } 
    [self performSelector:@selector(RemoveView) withObject:nil afterDelay:3.0]; 
} 

뷰가 버튼으로 한 지수가 정상적으로 작동되는 경우, 할당 해제지고 여기서 인덱스 0 UIActionSheet 버튼 내부 코드이다.

+0

대리자가 경고보기 전에 사라지는 것이 합리적입니까? 진정한 모달은 아니지만 UIAlertView는 모달보기처럼 보이며 모달보기로 사용하기위한 것입니다. 그런 관점에서 (그리고 몇 가지 가정을하고 자유롭게 수정하십시오), 경고보기가 생성되는 동안 (경고보기를 생성하는) 대리자가 더 이상 필요하지 않게됩니다 (보기 계층에서 팝업 됨). 표시됩니다. – pmf

+0

나는 질문을 편집하고 약간의 코드 –

답변

0

이 코드 조각이 문제 였다고 가정합니다. 내가 사용해야 전무, withObject : 여기에 대신 withObject의

[self performSelector:@selector(RemoveView) withObject:nil afterDelay:3.0]; 

는 것 자체는, 릴리스 문제를 해결 한합니다.

3

dealloc 메소드가 너무 일찍 호출되는 경우 표시되지 않은 위치에서 뷰를 유지해야하는 곳이있을 수 있습니다. 하지만 코드에 대한 자세한 내용을 알지 못하면 그 부분이 어디인지는 알 수 없습니다.

+0

로 업데이트했다. 그 코드는 다소 크다. 왜 코드를 게시하지 않았는가? 이제보기를 유지하는 것이 현재로서는 올바른 선택 인 것 같습니다. 그리고 그 사이에보기를 유지하면서 좋은 코딩 방법을 사용하고 있습니까? –

관련 문제