我有一个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
是nil
,即使self.viewControllers.first
仍然是完全相同的对象初始化,当我有。
有什么奇怪的方式UINavigationController
拥有其viewControllers
?
编辑: 我设法识别和修复在浅层的原因(见我的回答如下),但我还是想知道为什么会这样。我会很乐意接受和赞扬一个答案,可以解释发生了什么!
您不要在任何地方使用'rootViewController'。它在'init'结尾超出范围。因此,这个薄弱的参考资料不再指向任何事情。 – rmaddy
我确实在代码中引用它;我的真实代码是UINavigationController的另一个子类的子类,它有一个'initWithRootViewController'函数。我将更新问题中的代码。感谢您指出了这一点。 – mrgrieves