2015-01-25 5 views
2

현재 컨트롤러를 루트 컨트롤러에 해고하는 중입니다.iOS : 해제 할 때보기 컨트롤러가 해제되지 않습니다.

[navigationController popToRootViewControllerAnimated:YES]; 

그러나, 네비게이션 컨트롤러에있는 모든 뷰 컨트롤러 (컨트롤러 클래스의 메서드가 두 번 호출되고 있으며, 할당 해제의 메서드가 호출되지 않기 때문에 내가 말할 수있는)를 출시되지 않습니다. 왜 이것이 일어나고 있는지 알아 내기 위해해야 ​​할 일에 대한 조언이 필요합니다. 컨트롤러를 닫을 필요가있는 특정 방법이 있습니까, 아니면 다른 것이 발생하고있을 수 있습니다. ARC를 사용하고 있습니다.

+0

인스트루먼트는 무엇을 말합니까? – quellish

+1

ARC를 사용할 때 개체가 즉시 공개됩니다.혹시 다른 곳의 컨트롤러에 대한 강력한 참고 자료를 보유하고 있습니까? – mAu

+0

'navigationController = nil; '을 어딘가에 설정하고 있습니까? 'navigationController' 변수를 참조하는 모든 코드를 게시하십시오. –

답변

3

여러 가지 이유가있을 수 있지만 터지는 'viewController'에 대한 강력한 포인터를 가지고있을 가능성이 큽니다. 한 예로 viewControllerdelegate에서 다른 viewController이고 delegate 속성이 Strong 인 경우 두 개의 viewController은 서로에 대해 강력한 포인터를 유지합니다.

튀어 나오고있는 viewController에 대한 강력한 포인터가있는 다른 개체가 없는지 확인하십시오.

0

튀어 나오고있는 컨트롤러는 실제 라이브 viewController에서 유지됩니다. 그게 다야. 당신이 viewController을 누르면

  • 가, 장소에 생성 :

    UIViewController *vc = [UIViewController initWith...]; 
    [navigationController pushViewController:vc animated:YES]; 
    
  • 다른 솔루션은 그것에 weak 참조가 있습니다 :

    //Property in the interface 
    @property (nonatomic, weak) UIViewController *vc; 
    
    //In the method 
    _vc = [UIViewController initWith...]; 
    [navigationController pushViewController:vc animated:YES]; 
    
을 당신은이 개 솔루션을

다른 참조가없는 viewController이 튀어 나올 때 b 할당이 해제되었습니다.

건배!

3

위임자에 대한 강력한 참조를 보유 할 수있을뿐만 아니라보기 컨트롤러를 사용하는 블록도 확인하고 블록 내부의 약한 참조를 항상 사용해야합니다. 애플 docs에서

:

enter image description here

은의 당신이 HTTP 요청을하고 당신이 당신의 뷰 컨트롤러의 관점에서 서버에서 얻을 사용자에 대한 몇 가지 정보를 표시하려고한다고 가정합시다. 요청을로드하고 블록을 실행 완료 될 때까지이 경우

- (void)requestUserInfo 
{ 
    [self.client makeGETRequest:@"http://example.org/user/1/" usingBlock:^(User *user, NSError *error) { 
      if (error) { 
       [self.errorView displayWithError:error]; 
      } 
      else { 
       self.userView.user = user; 
       [self.userView setNeedsLayout]; 
      } 
    }]; 
} 

, 사용자가 결과를 반환하는 요청을 기다리고 지루 그냥 페이지를 닫습니다 "뒤로"버튼을 탭 도착, 뷰 컨트롤러는 해제되지 않습니다 . dealloc을 무시하여 직접 볼 수 있습니다.

따라서, 필요한 경우를 제외하고 항상 블록 내부에 self에 대한 참조 번호는 __weak입니다.

- (void)requestUserInfo 
{ 
    __weak UIViewController *weakSelf = self; 

    [self.client makeGETRequest:@"http://example.org/user/1/" usingBlock:^(User *user, NSError *error) { 
      if (error) { 
       [weakSelf.errorView displayWithError:error]; 
      } 
      else { 
       weakSelf.userView.user = user; 
       [weakSelf.userView setNeedsLayout]; 
      } 
    }]; 
}