0

weak 인스턴스 변수가 UINavigationController.viewControllers 스택의보기 컨트롤러에 있습니다.약한 참조가 제로화되었지만 객체가 할당 해제되지 않았습니다.

변수가 자동으로 nil으로 바뀌지 만보기 컨트롤러가 할당 해제되지 않았습니다 (UINavigationController이 소유하고 있기 때문에).

약한 참조가 제로가되는 이유는 무엇입니까?

class NavController: SuperNavigationController 
{ 
    weak var weakViewController: UIViewController? 

    required override init() { 

     let rootViewController: UIViewController 

     if (/* whatever */) { 
      rootViewController = ViewController1(/*whatever*/) 
      weakViewController = rootViewController 
     } else { 
      /* whatever */ 
     } 

     /*** `weakViewController` is not `nil` at this point ***/ 

     /*** 
     *** This superclass function just does: 
     *** super.init(navBarClass:toolbarClass:) 
     *** viewControllers = [rootViewController] 
     ***/ 
     super.init(rootViewController: rootViewController) 
    } 

    // Without this, I get an "unimplemented initializer" exception 
    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { 
     super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) 
    } 

... 
} 

하지만 최대한 빨리 viewDidLoad에 도착으로, weakViewControllerself.viewControllers.first 여전히 초기화 할 때 내가 가진 동일한 목적지라도, nil입니다.

이상한 점이 있습니까 UINavigationControllerviewControllers을 소유하고 있습니까?

편집 : 내가 확인하고 (내 대답은 아래 참조) 얕은 수준에서 원인을 해결하기 위해 관리,하지만 난 여전히 이런 이유를 알고 싶습니다. 나는 행복하게 받아들이고 무슨 일인지 설명 할 수있는 대답을 upvote거야!

+0

어디서나 'rootViewController'를 사용하지 마십시오. 'init'의 끝에서 범위를 벗어난다. 결과적으로 약한 참조가 더 이상 가리 키지 않습니다. – rmaddy

+0

나는이 코드에서 실제로 이것을 사용한다; 내 실제 코드는'UINavigationController'의 다른 서브 클래스를 하위 클래스로 가지고 있으며,'initWithRootViewController' 함수를 가지고 있습니다. 나는이 질문에서 코드를 업데이트 할 것이다. 그 점을 지적 해 주셔서 감사합니다. – mrgrieves

답변

0

super.init()을 호출하면 weak 하위 클래스 인스턴스 변수가 0으로 설정되었습니다.

나는 super.init()

0

약한 참조는 아무 것도이 가리키는되지 않은 경우, 나는 그것을 필요로하지 않는다는 것을 말한다에 대한 호출이 끝날 때까지 weakViewController을 설정하기 위해 대기하여이 고정. 그래서 주인이 심판을 가지고 약한 사람이라면, 호는 그 심문을 해제 할 수 있습니다.

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html

+0

실제 객체는'viewControllers' 속성이'rootViewController'를 보유하고 있기 때문에'UINavigationController'에 의해 유지됩니다. 이것은'weakViewController'에 의해 참조 된 동일한 객체입니다. 실제 객체는 할당 해제되지 않기 때문에'weakViewController' 자체가 0이된다는 것을 이해하지 못한다. – mrgrieves

+0

'''''rootViewController'''가 없어지는 메카닉은 ARC가 그것에 대한 강력한 참조를 보지 못한다는 것입니다. 값을 사용하여 이것을''UINavigationController''' (또는 하위 클래스 체인의 다른 곳)에 전달할 수 있습니까? '''NavController'' 객체가'''rootViewController'''를 nil로 검사하기 전에 파괴 될 수 있습니까? –

+0

음'rootViewController'는 강력한 참조입니다. 'weakViewController'는 약한 인스턴스 변수입니다. 네비게이션 컨트롤러 수퍼 클래스는 반환하기 전에 UINavigationController.viewControllers' 속성을 설정하므로'rootViewController'가 범위를 벗어나지 않습니다. – mrgrieves