2011-11-22 5 views
0

탐색 스택에 두 개의보기 컨트롤러가 있습니다. 첫 번째보기 컨트롤러에는 웹 사이트로 이동하여 앱에서 벗어나는 경고를 표시하는 메소드가 있습니다. 그들이 아니오를 클릭하면 아무 일도 일어나지 않습니다. 그렇다면 링크를 엽니 다. 이것은 모두 작동합니다. 내 문제는 지금 탐색 스택의 두 번째보기 컨트롤러에서이 메서드를 호출하려는 경우 내 첫 번째보기 컨트롤러는 dealloc을 가져오고 대리자는 결코 호출되지 않습니다. 여기에 무슨 일이 일어나고 있는지에 대한 의사 코드가 있습니다. SecondViewcontroller에서UIAlertView 대리자가 호출되기 전에 개체가 dealloc됩니다.

:

- (void)TargetSelectionPressed:(NSNotification *)notification { 

    FirstViewController *dummyCtlr = nil; 
    BOOL shouldPushToFistCtlr = NO; 

    NSArray *controllers = [[NSArray alloc] initWithArray:[self.navigationController viewControllers]]; 

    for (UIViewController *ctlr in controllers) { 
     if ([ctlr isKindOfClass:[FirstViewController class]]) { 
      dummyCtlr = (FirstViewController *)ctlr; 
      break; 
     } 
    } 
    if (dummyCtlr == nil) { 
     FirstViewController *gtc = [[[FirstViewController alloc] init] autorelease]; 
     dummyCtlr = gtc; 
     shouldPushToFistCtlr = YES; 
    } 

    switch (targetSelection) { 
     case TARGET_LOCATION: 
      break; 
     case TARGET_CONDITION: { 
      if (shouldPushToGTC) { 
       [self.navigationController pushViewController:dummyCtlr animated:YES]; 
      } 
      else { 
       [self.navigationController popToViewController:dummyCtlr animated:YES]; 
      } 
      break; 
     } 
     case TARGET_LINK: { 
      [dummyCtlr BuildURL:link]; 
      break; 
     } 
     default: 
      break; 
    } 
    [controllers release]; 
} 

FirstViewcontroller

- (void)BuildURL:(NSString*)link { 
    self.ExternalLink = link;  NSString *message = [[NSString alloc] initWithFormat:@"Would you like to open %@ in Safari?", link]; 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Open Safari" message:message delegate:self cancelButtonTitle:@"No" otherButtonTitles:@"Yes", nil]; 
    [alert show]; 
    self.SafariAlertView = alert; 
    self.SafariAlertView.delegate = self; 
    [alert release]; 
    [message release]; 
} 

- (void)dealloc { 
    [safariAlertView release]; 
    self.SafariAlertView.delegate = nil; 
    [super dealloc]; 
} 

답변

0

확인 *dummyCtlrnil 오히려 dummyCtlrnil 경우보다합니다.

0

dummyCtlr에 대한 속성을 만들면 해당 개체가 델그 게이트가 호출 될 수있을만큼 충분히 오래 머물렀다는 것을 알게되었습니다.

관련 문제