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
에 도착으로, weakViewController
는 self.viewControllers.first
여전히 초기화 할 때 내가 가진 동일한 목적지라도, nil
입니다.
이상한 점이 있습니까 UINavigationController
은 viewControllers
을 소유하고 있습니까?
편집 : 내가 확인하고 (내 대답은 아래 참조) 얕은 수준에서 원인을 해결하기 위해 관리,하지만 난 여전히 이런 이유를 알고 싶습니다. 나는 행복하게 받아들이고 무슨 일인지 설명 할 수있는 대답을 upvote거야!
어디서나 'rootViewController'를 사용하지 마십시오. 'init'의 끝에서 범위를 벗어난다. 결과적으로 약한 참조가 더 이상 가리 키지 않습니다. – rmaddy
나는이 코드에서 실제로 이것을 사용한다; 내 실제 코드는'UINavigationController'의 다른 서브 클래스를 하위 클래스로 가지고 있으며,'initWithRootViewController' 함수를 가지고 있습니다. 나는이 질문에서 코드를 업데이트 할 것이다. 그 점을 지적 해 주셔서 감사합니다. – mrgrieves